diff --git a/accessible/generic/Accessible.cpp b/accessible/generic/Accessible.cpp index 76447bab800d..c6ada3ad9547 100644 --- a/accessible/generic/Accessible.cpp +++ b/accessible/generic/Accessible.cpp @@ -525,11 +525,8 @@ Accessible::ChildAtPoint(int32_t aX, int32_t aY, { // If we can't find the point in a child, we will return the fallback answer: // we return |this| if the point is within it, otherwise nullptr. - nsIntRect rect = Bounds(); - if (rect.IsEmpty()) - return nullptr; - Accessible* fallbackAnswer = nullptr; + nsIntRect rect = Bounds(); if (aX >= rect.x && aX < rect.x + rect.width && aY >= rect.y && aY < rect.y + rect.height) fallbackAnswer = this; diff --git a/accessible/tests/mochitest/hittest/test_general.html b/accessible/tests/mochitest/hittest/test_general.html index 36fdd6e648bf..74ff4fe298d7 100644 --- a/accessible/tests/mochitest/hittest/test_general.html +++ b/accessible/tests/mochitest/hittest/test_general.html @@ -68,6 +68,8 @@ if (!MAC) { hitTest("imgmap", theLetterA, theLetterA); hitTest("container", "imgmap", theLetterA); + // hit testing for element contained by zero-width element + hitTest("container2", "container2_input", "container2_input"); SimpleTest.finish(); } @@ -106,5 +108,8 @@ if (!MAC) { +
+ +
diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 3842f38e6ce3..809201bccaac 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -1092,3 +1092,7 @@ pref("dom.mozSettings.allowForceReadOnly", false); // RequestSync API is enabled by default on B2G. pref("dom.requestSync.enabled", true); + +// Enable hardware vsync compositor +pref("gfx.vsync.hw-vsync.enabled", true); +pref("gfx.vsync.compositor", true); diff --git a/b2g/config/dolphin/sources.xml b/b2g/config/dolphin/sources.xml index 0611d04e4b26..23ea78a80fe2 100644 --- a/b2g/config/dolphin/sources.xml +++ b/b2g/config/dolphin/sources.xml @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + diff --git a/b2g/config/emulator-ics/sources.xml b/b2g/config/emulator-ics/sources.xml index 979425a048f4..dec078509653 100644 --- a/b2g/config/emulator-ics/sources.xml +++ b/b2g/config/emulator-ics/sources.xml @@ -19,13 +19,13 @@ - + - + diff --git a/b2g/config/emulator-jb/sources.xml b/b2g/config/emulator-jb/sources.xml index bb97c8333837..1490df8ae69d 100644 --- a/b2g/config/emulator-jb/sources.xml +++ b/b2g/config/emulator-jb/sources.xml @@ -17,10 +17,10 @@ - + - + @@ -135,7 +135,7 @@ - + diff --git a/b2g/config/emulator-kk/sources.xml b/b2g/config/emulator-kk/sources.xml index 5661e45e62a9..ed791a0ee42d 100644 --- a/b2g/config/emulator-kk/sources.xml +++ b/b2g/config/emulator-kk/sources.xml @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + diff --git a/b2g/config/emulator/sources.xml b/b2g/config/emulator/sources.xml index 979425a048f4..dec078509653 100644 --- a/b2g/config/emulator/sources.xml +++ b/b2g/config/emulator/sources.xml @@ -19,13 +19,13 @@ - + - + diff --git a/b2g/config/flame-kk/sources.xml b/b2g/config/flame-kk/sources.xml index 4a1a680d5263..0fde7a64d070 100644 --- a/b2g/config/flame-kk/sources.xml +++ b/b2g/config/flame-kk/sources.xml @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -146,7 +146,7 @@ - + diff --git a/b2g/config/flame/sources.xml b/b2g/config/flame/sources.xml index f5f6492c05b0..90d2c14a247e 100644 --- a/b2g/config/flame/sources.xml +++ b/b2g/config/flame/sources.xml @@ -17,10 +17,10 @@ - + - + @@ -145,7 +145,7 @@ - + diff --git a/b2g/config/gaia.json b/b2g/config/gaia.json index b87f73a3ea65..0ba8e34e390a 100644 --- a/b2g/config/gaia.json +++ b/b2g/config/gaia.json @@ -1,9 +1,9 @@ { "git": { - "git_revision": "793773bb2944b42a85dd160049e605cbd880c4da", + "git_revision": "b02ec9713e6de8d96c6954d2c0dfd0442b0656ac", "remote": "https://git.mozilla.org/releases/gaia.git", "branch": "" }, - "revision": "23aac85cce8d5d0435b7d5639e4ff6410c2dd121", + "revision": "bdc67bb5e9be1469a96158d657a1829373c4152a", "repo_path": "integration/gaia-central" } diff --git a/b2g/config/hamachi/sources.xml b/b2g/config/hamachi/sources.xml index 748db1cf6437..594f3a23eeab 100644 --- a/b2g/config/hamachi/sources.xml +++ b/b2g/config/hamachi/sources.xml @@ -17,11 +17,11 @@ - + - + diff --git a/b2g/config/helix/sources.xml b/b2g/config/helix/sources.xml index 080e42d821b4..717891a0d239 100644 --- a/b2g/config/helix/sources.xml +++ b/b2g/config/helix/sources.xml @@ -15,7 +15,7 @@ - + diff --git a/b2g/config/nexus-4/sources.xml b/b2g/config/nexus-4/sources.xml index dd17c8a88dbc..f485c57d3c5d 100644 --- a/b2g/config/nexus-4/sources.xml +++ b/b2g/config/nexus-4/sources.xml @@ -17,10 +17,10 @@ - + - + @@ -130,7 +130,7 @@ - + diff --git a/b2g/config/wasabi/sources.xml b/b2g/config/wasabi/sources.xml index 7f2717795cac..096900964714 100644 --- a/b2g/config/wasabi/sources.xml +++ b/b2g/config/wasabi/sources.xml @@ -17,12 +17,12 @@ - + - + diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index f6395019d68d..ef1615b4867d 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1186,7 +1186,7 @@ pref("security.sandbox.windows.log", false); // To get a different setting for a particular plugin replace "default", with // the plugin's nice file name, see: nsPluginTag::GetNiceFileName. pref("dom.ipc.plugins.sandbox.default", false); -pref("dom.ipc.plugins.sandbox.flash", false); +pref("dom.ipc.plugins.sandbox.flash", true); #if defined(MOZ_CONTENT_SANDBOX) // This controls whether the Windows content process sandbox is using a more diff --git a/build/mach_bootstrap.py b/build/mach_bootstrap.py index ea72431c0b41..f534147d5509 100644 --- a/build/mach_bootstrap.py +++ b/build/mach_bootstrap.py @@ -34,6 +34,8 @@ SEARCH_PATHS = [ 'python/jsmin', 'python/psutil', 'python/which', + 'python/pystache', + 'python/pyyaml/lib', 'build/pymake', 'config', 'dom/bindings', @@ -42,6 +44,7 @@ SEARCH_PATHS = [ 'other-licenses/ply', 'xpcom/idl-parser', 'testing', + 'testing/taskcluster', 'testing/xpcshell', 'testing/web-platform', 'testing/web-platform/harness', @@ -79,6 +82,7 @@ MACH_MODULES = [ 'python/mozbuild/mozbuild/frontend/mach_commands.py', 'services/common/tests/mach_commands.py', 'testing/mach_commands.py', + 'testing/taskcluster/mach_commands.py', 'testing/marionette/mach_commands.py', 'testing/mochitest/mach_commands.py', 'testing/xpcshell/mach_commands.py', @@ -108,6 +112,11 @@ CATEGORIES = { 'long': 'Run tests.', 'priority': 60, }, + 'ci': { + 'short': 'CI', + 'long': 'Taskcluster commands', + 'priority': 59 + }, 'devenv': { 'short': 'Development Environment', 'long': 'Set up and configure your development environment.', diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index f576d2fb2e4d..34df6e6aa9d9 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -3383,10 +3383,8 @@ nsDocShell::SetDocLoaderParent(nsDocLoader * aParent) { SetIsActive(value); } - if (NS_SUCCEEDED(parentAsDocShell->GetIsPrerendered(&value))) { - if (value) { - SetIsPrerendered(true); - } + if (parentAsDocShell->GetIsPrerendered()) { + SetIsPrerendered(true); } if (NS_FAILED(parentAsDocShell->GetAllowDNSPrefetch(&value))) { value = false; diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl index acc4dbded56f..9cd80000f8f6 100644 --- a/docshell/base/nsIDocShell.idl +++ b/docshell/base/nsIDocShell.idl @@ -624,7 +624,7 @@ interface nsIDocShell : nsIDocShellTreeItem * native code to be able to put a docshell in prerendering. */ [noscript] void SetIsPrerendered(in boolean prerendered); - readonly attribute boolean isPrerendered; + [infallible] readonly attribute boolean isPrerendered; /** * The ID of the docshell in the session history. diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index fc02c48a29f2..cc719beb455f 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -397,10 +397,10 @@ EventListenerManagerHashClearEntry(PLDHashTable *table, PLDHashEntryHdr *entry) lm->~EventListenerManagerMapEntry(); } -class SameOriginChecker MOZ_FINAL : public nsIChannelEventSink, - public nsIInterfaceRequestor +class SameOriginCheckerImpl MOZ_FINAL : public nsIChannelEventSink, + public nsIInterfaceRequestor { - ~SameOriginChecker() {} + ~SameOriginCheckerImpl() {} NS_DECL_ISUPPORTS NS_DECL_NSICHANNELEVENTSINK @@ -5648,11 +5648,11 @@ nsContentUtils::StringContainsASCIIUpper(const nsAString& aStr) /* static */ nsIInterfaceRequestor* -nsContentUtils::GetSameOriginChecker() +nsContentUtils::SameOriginChecker() { if (!sSameOriginChecker) { - sSameOriginChecker = new SameOriginChecker(); - NS_IF_ADDREF(sSameOriginChecker); + sSameOriginChecker = new SameOriginCheckerImpl(); + NS_ADDREF(sSameOriginChecker); } return sSameOriginChecker; } @@ -5683,15 +5683,15 @@ nsContentUtils::CheckSameOrigin(nsIChannel *aOldChannel, nsIChannel *aNewChannel return rv; } -NS_IMPL_ISUPPORTS(SameOriginChecker, +NS_IMPL_ISUPPORTS(SameOriginCheckerImpl, nsIChannelEventSink, nsIInterfaceRequestor) NS_IMETHODIMP -SameOriginChecker::AsyncOnChannelRedirect(nsIChannel *aOldChannel, - nsIChannel *aNewChannel, - uint32_t aFlags, - nsIAsyncVerifyRedirectCallback *cb) +SameOriginCheckerImpl::AsyncOnChannelRedirect(nsIChannel* aOldChannel, + nsIChannel* aNewChannel, + uint32_t aFlags, + nsIAsyncVerifyRedirectCallback* cb) { NS_PRECONDITION(aNewChannel, "Redirecting to null channel?"); @@ -5704,7 +5704,7 @@ SameOriginChecker::AsyncOnChannelRedirect(nsIChannel *aOldChannel, } NS_IMETHODIMP -SameOriginChecker::GetInterface(const nsIID & aIID, void **aResult) +SameOriginCheckerImpl::GetInterface(const nsIID& aIID, void** aResult) { return QueryInterface(aIID, aResult); } diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index 4cbff1d26506..0bb2f9b4fbe2 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -1635,7 +1635,7 @@ public: // Returns NS_OK for same origin, error (NS_ERROR_DOM_BAD_URI) if not. static nsresult CheckSameOrigin(nsIChannel *aOldChannel, nsIChannel *aNewChannel); - static nsIInterfaceRequestor* GetSameOriginChecker(); + static nsIInterfaceRequestor* SameOriginChecker(); /** * Get the Origin of the passed in nsIPrincipal or nsIURI. If the passed in diff --git a/dom/base/nsDocument.cpp b/dom/base/nsDocument.cpp index 6864a643617d..e5530a032e3f 100644 --- a/dom/base/nsDocument.cpp +++ b/dom/base/nsDocument.cpp @@ -1337,8 +1337,7 @@ nsExternalResourceMap::PendingLoad::StartLoad(nsIURI* aURI, nsIDocument* doc = aRequestingNode->OwnerDoc(); - nsCOMPtr req = nsContentUtils::GetSameOriginChecker(); - NS_ENSURE_TRUE(req, NS_ERROR_OUT_OF_MEMORY); + nsCOMPtr req = nsContentUtils::SameOriginChecker(); nsCOMPtr loadGroup = doc->GetDocumentLoadGroup(); nsCOMPtr channel; diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 2933846462cc..c8d03dd35f5d 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -4342,10 +4342,11 @@ nsGlobalWindow::GetOwnPropertyNames(JSContext* aCx, nsTArray& aNames, } /* static */ bool -nsGlobalWindow::IsChromeWindow(JSContext* aCx, JSObject* aObj) +nsGlobalWindow::IsPrivilegedChromeWindow(JSContext* aCx, JSObject* aObj) { // For now, have to deal with XPConnect objects here. - return xpc::WindowOrNull(aObj)->IsChromeWindow(); + return xpc::WindowOrNull(aObj)->IsChromeWindow() && + nsContentUtils::ObjectPrincipal(aObj) == nsContentUtils::GetSystemPrincipal(); } /* static */ bool diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h index 731b1390887c..647fa45e06ec 100644 --- a/dom/base/nsGlobalWindow.h +++ b/dom/base/nsGlobalWindow.h @@ -491,7 +491,7 @@ public: void GetSupportedNames(nsTArray& aNames); - static bool IsChromeWindow(JSContext* /* unused */, JSObject* aObj); + static bool IsPrivilegedChromeWindow(JSContext* /* unused */, JSObject* aObj); static bool IsShowModalDialogEnabled(JSContext* /* unused */ = nullptr, JSObject* /* unused */ = nullptr); diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index e477e08a9b0d..39fe8fd08445 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -20,6 +20,7 @@ #include "jsfriendapi.h" #include "nsContentUtils.h" #include "nsGlobalWindow.h" +#include "nsIDocShell.h" #include "nsIDOMGlobalPropertyInitializer.h" #include "nsIPermissionManager.h" #include "nsIPrincipal.h" @@ -2381,12 +2382,47 @@ CheckPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[ return false; } -bool -CheckSafetyInPrerendering(JSContext* aCx, JSObject* aObj) +void +HandlePrerenderingViolation(nsPIDOMWindow* aWindow) { - //TODO: Check if page is being prerendered. - //Returning false for now. - return false; + // Suspend the window and its workers, and its children too. + aWindow->SuspendTimeouts(); + + // Suspend event handling on the document + nsCOMPtr doc = aWindow->GetExtantDoc(); + if (doc) { + doc->SuppressEventHandling(nsIDocument::eEvents); + } +} + +bool +EnforceNotInPrerendering(JSContext* aCx, JSObject* aObj) +{ + JS::Rooted thisObj(aCx, js::CheckedUnwrap(aObj)); + if (!thisObj) { + // Without a this object, we cannot check the safety. + return true; + } + nsGlobalWindow* window = xpc::WindowGlobalOrNull(thisObj); + if (!window) { + // Without a window, we cannot check the safety. + return true; + } + + nsIDocShell* docShell = window->GetDocShell(); + if (!docShell) { + // Without a docshell, we cannot check the safety. + return true; + } + + if (docShell->GetIsPrerendered()) { + HandlePrerenderingViolation(window); + // When the bindings layer sees a false return value, it returns false form + // the JSNative in order to trigger an uncatchable exception. + return false; + } + + return true; } bool diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index 6e7c874108fb..53846fa2a5fd 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -3142,9 +3142,20 @@ AssertReturnTypeMatchesJitinfo(const JSJitInfo* aJitinfo, bool CheckPermissions(JSContext* aCx, JSObject* aObj, const char* const aPermissions[]); -//Returns true if page is being prerendered. +// This function is called by the bindings layer for methods/getters/setters +// that are not safe to be called in prerendering mode. It checks to make sure +// that the |this| object is not running in a global that is in prerendering +// mode. Otherwise, it aborts execution of timers and event handlers, and +// returns false which gets converted to an uncatchable exception by the +// bindings layer. bool -CheckSafetyInPrerendering(JSContext* aCx, JSObject* aObj); +EnforceNotInPrerendering(JSContext* aCx, JSObject* aObj); + +// Handles the violation of a blacklisted action in prerendering mode by +// aborting the scripts, and preventing timers and event handlers from running +// in the window in the future. +void +HandlePrerenderingViolation(nsPIDOMWindow* aWindow); bool CallerSubsumes(JSObject* aObject); diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index aa1d02539ffd..3d5570128876 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -1829,7 +1829,7 @@ addExternalIface('MozRDFCompositeDataSource', nativeType='nsIRDFCompositeDataSou addExternalIface('MozRDFResource', nativeType='nsIRDFResource', notflattened=True) addExternalIface('MozSmsMessage') addExternalIface('MozTreeView', nativeType='nsITreeView', - headerFile='nsITreeView.h') + headerFile='nsITreeView.h', notflattened=True) addExternalIface('MozWakeLockListener', headerFile='nsIDOMWakeLockListener.h') addExternalIface('MozXULTemplateBuilder', nativeType='nsIXULTemplateBuilder') addExternalIface('nsIBrowserDOMWindow', nativeType='nsIBrowserDOMWindow', diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 85cfa07bb9f4..d2972fe95b44 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -6506,8 +6506,10 @@ class CGPerSignatureCall(CGThing): for i in descriptor.interface.getInheritedInterfaces())): cgThings.append(CGGeneric(dedent( """ - if (mozilla::dom::CheckSafetyInPrerendering(cx, obj)) { - //TODO: Handle call into unsafe API during Prerendering (Bug 730101) + if (!mozilla::dom::EnforceNotInPrerendering(cx, obj)) { + // Return false from the JSNative in order to trigger + // an uncatchable exception. + MOZ_ASSERT(!JS_IsExceptionPending(cx)); return false; } """))) diff --git a/dom/bindings/test/chrome.ini b/dom/bindings/test/chrome.ini index 689bb0415faa..173fd79102a4 100644 --- a/dom/bindings/test/chrome.ini +++ b/dom/bindings/test/chrome.ini @@ -6,3 +6,8 @@ [test_dom_xrays.html] [test_proxies_via_xray.html] [test_document_location_via_xray_cached.html] +[test_blacklisted_prerendering_function.xul] +support-files = + file_focuser.html + file_fullScreenPropertyAccessor.html +skip-if = e10s # prerendering doesn't work in e10s yet diff --git a/dom/bindings/test/file_focuser.html b/dom/bindings/test/file_focuser.html new file mode 100644 index 000000000000..0d5240f95b1a --- /dev/null +++ b/dom/bindings/test/file_focuser.html @@ -0,0 +1,24 @@ + +
+ diff --git a/dom/bindings/test/file_fullScreenPropertyAccessor.html b/dom/bindings/test/file_fullScreenPropertyAccessor.html new file mode 100644 index 000000000000..92a37e0bac62 --- /dev/null +++ b/dom/bindings/test/file_fullScreenPropertyAccessor.html @@ -0,0 +1,24 @@ + +
+ diff --git a/dom/bindings/test/test_blacklisted_prerendering_function.xul b/dom/bindings/test/test_blacklisted_prerendering_function.xul new file mode 100644 index 000000000000..02a76d88d975 --- /dev/null +++ b/dom/bindings/test/test_blacklisted_prerendering_function.xul @@ -0,0 +1,124 @@ + + + + + + + + + + +Mozilla Bug 1069719 +

+ +
+
+ + + +
diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.cpp b/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.cpp new file mode 100644 index 000000000000..7c958e7cc656 --- /dev/null +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.cpp @@ -0,0 +1,429 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "BluetoothDaemonA2dpInterface.h" +#include "BluetoothDaemonSetupInterface.h" +#include "mozilla/unused.h" + +BEGIN_BLUETOOTH_NAMESPACE + +// +// A2DP module +// + +BluetoothA2dpNotificationHandler* + BluetoothDaemonA2dpModule::sNotificationHandler; + +void +BluetoothDaemonA2dpModule::SetNotificationHandler( + BluetoothA2dpNotificationHandler* aNotificationHandler) +{ + sNotificationHandler = aNotificationHandler; +} + +nsresult +BluetoothDaemonA2dpModule::Send(BluetoothDaemonPDU* aPDU, + BluetoothA2dpResultHandler* aRes) +{ + aRes->AddRef(); // Keep reference for response + return Send(aPDU, static_cast(aRes)); +} + +void +BluetoothDaemonA2dpModule::HandleSvc(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, void* aUserData) +{ + static void (BluetoothDaemonA2dpModule::* const HandleOp[])( + const BluetoothDaemonPDUHeader&, BluetoothDaemonPDU&, void*) = { + INIT_ARRAY_AT(0, &BluetoothDaemonA2dpModule::HandleRsp), + INIT_ARRAY_AT(1, &BluetoothDaemonA2dpModule::HandleNtf), + }; + + MOZ_ASSERT(!NS_IsMainThread()); + + // negate twice to map bit to 0/1 + unsigned int isNtf = !!(aHeader.mOpcode & 0x80); + + (this->*(HandleOp[isNtf]))(aHeader, aPDU, aUserData); +} + +// Commands +// + +nsresult +BluetoothDaemonA2dpModule::ConnectCmd( + const nsAString& aRemoteAddr, BluetoothA2dpResultHandler* aRes) +{ + MOZ_ASSERT(NS_IsMainThread()); + + nsAutoPtr pdu(new BluetoothDaemonPDU(SERVICE_ID, + OPCODE_CONNECT, + 6)); // Address + nsresult rv = PackPDU( + PackConversion(aRemoteAddr), *pdu); + if (NS_FAILED(rv)) { + return rv; + } + rv = Send(pdu, aRes); + if (NS_FAILED(rv)) { + return rv; + } + unused << pdu.forget(); + return NS_OK; +} + +nsresult +BluetoothDaemonA2dpModule::DisconnectCmd( + const nsAString& aRemoteAddr, BluetoothA2dpResultHandler* aRes) +{ + MOZ_ASSERT(NS_IsMainThread()); + + nsAutoPtr pdu(new BluetoothDaemonPDU(SERVICE_ID, + OPCODE_DISCONNECT, + 6)); // Address + nsresult rv = PackPDU( + PackConversion(aRemoteAddr), *pdu); + if (NS_FAILED(rv)) { + return rv; + } + rv = Send(pdu, aRes); + if (NS_FAILED(rv)) { + return rv; + } + unused << pdu.forget(); + return NS_OK; +} + +// Responses +// + +void +BluetoothDaemonA2dpModule::ErrorRsp( + const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, BluetoothA2dpResultHandler* aRes) +{ + ErrorRunnable::Dispatch( + aRes, &BluetoothA2dpResultHandler::OnError, UnpackPDUInitOp(aPDU)); +} + +void +BluetoothDaemonA2dpModule::ConnectRsp( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, + BluetoothA2dpResultHandler* aRes) +{ + ResultRunnable::Dispatch( + aRes, &BluetoothA2dpResultHandler::Connect, UnpackPDUInitOp(aPDU)); +} + +void +BluetoothDaemonA2dpModule::DisconnectRsp( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, + BluetoothA2dpResultHandler* aRes) +{ + ResultRunnable::Dispatch( + aRes, &BluetoothA2dpResultHandler::Disconnect, UnpackPDUInitOp(aPDU)); +} + +void +BluetoothDaemonA2dpModule::HandleRsp( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, + void* aUserData) +{ + static void (BluetoothDaemonA2dpModule::* const HandleRsp[])( + const BluetoothDaemonPDUHeader&, + BluetoothDaemonPDU&, + BluetoothA2dpResultHandler*) = { + INIT_ARRAY_AT(OPCODE_ERROR, + &BluetoothDaemonA2dpModule::ErrorRsp), + INIT_ARRAY_AT(OPCODE_CONNECT, + &BluetoothDaemonA2dpModule::ConnectRsp), + INIT_ARRAY_AT(OPCODE_DISCONNECT, + &BluetoothDaemonA2dpModule::DisconnectRsp), + }; + + MOZ_ASSERT(!NS_IsMainThread()); // I/O thread + + if (NS_WARN_IF(!(aHeader.mOpcode < MOZ_ARRAY_LENGTH(HandleRsp))) || + NS_WARN_IF(!HandleRsp[aHeader.mOpcode])) { + return; + } + + nsRefPtr res = + already_AddRefed( + static_cast(aUserData)); + + if (!res) { + return; // Return early if no result handler has been set for response + } + + (this->*(HandleRsp[aHeader.mOpcode]))(aHeader, aPDU, res); +} + +// Notifications +// + +// Returns the current notification handler to a notification runnable +class BluetoothDaemonA2dpModule::NotificationHandlerWrapper MOZ_FINAL +{ +public: + typedef BluetoothA2dpNotificationHandler ObjectType; + + static ObjectType* GetInstance() + { + MOZ_ASSERT(NS_IsMainThread()); + + return sNotificationHandler; + } +}; + +// Init operator class for ConnectionStateNotification +class BluetoothDaemonA2dpModule::ConnectionStateInitOp MOZ_FINAL + : private PDUInitOp +{ +public: + ConnectionStateInitOp(BluetoothDaemonPDU& aPDU) + : PDUInitOp(aPDU) + { } + + nsresult + operator () (BluetoothA2dpConnectionState& aArg1, nsString& aArg2) const + { + BluetoothDaemonPDU& pdu = GetPDU(); + + /* Read state */ + nsresult rv = UnpackPDU(pdu, aArg1); + if (NS_FAILED(rv)) { + return rv; + } + + /* Read address */ + rv = UnpackPDU( + pdu, UnpackConversion(aArg2)); + if (NS_FAILED(rv)) { + return rv; + } + WarnAboutTrailingData(); + return NS_OK; + } +}; + +void +BluetoothDaemonA2dpModule::ConnectionStateNtf( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU) +{ + ConnectionStateNotification::Dispatch( + &BluetoothA2dpNotificationHandler::ConnectionStateNotification, + ConnectionStateInitOp(aPDU)); +} + +// Init operator class for AudioStateNotification +class BluetoothDaemonA2dpModule::AudioStateInitOp MOZ_FINAL + : private PDUInitOp +{ +public: + AudioStateInitOp(BluetoothDaemonPDU& aPDU) + : PDUInitOp(aPDU) + { } + + nsresult + operator () (BluetoothA2dpAudioState& aArg1, + nsString& aArg2) const + { + BluetoothDaemonPDU& pdu = GetPDU(); + + /* Read state */ + nsresult rv = UnpackPDU(pdu, aArg1); + if (NS_FAILED(rv)) { + return rv; + } + + /* Read address */ + rv = UnpackPDU( + pdu, UnpackConversion(aArg2)); + if (NS_FAILED(rv)) { + return rv; + } + WarnAboutTrailingData(); + return NS_OK; + } +}; + +void +BluetoothDaemonA2dpModule::AudioStateNtf( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU) +{ + AudioStateNotification::Dispatch( + &BluetoothA2dpNotificationHandler::AudioStateNotification, + AudioStateInitOp(aPDU)); +} + +void +BluetoothDaemonA2dpModule::HandleNtf( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, + void* aUserData) +{ + static void (BluetoothDaemonA2dpModule::* const HandleNtf[])( + const BluetoothDaemonPDUHeader&, BluetoothDaemonPDU&) = { + INIT_ARRAY_AT(0, &BluetoothDaemonA2dpModule::ConnectionStateNtf), + INIT_ARRAY_AT(1, &BluetoothDaemonA2dpModule::AudioStateNtf), + }; + + MOZ_ASSERT(!NS_IsMainThread()); + + uint8_t index = aHeader.mOpcode - 0x81; + + if (NS_WARN_IF(!(index < MOZ_ARRAY_LENGTH(HandleNtf))) || + NS_WARN_IF(!HandleNtf[index])) { + return; + } + + (this->*(HandleNtf[index]))(aHeader, aPDU); +} + +// +// A2DP interface +// + +BluetoothDaemonA2dpInterface::BluetoothDaemonA2dpInterface( + BluetoothDaemonA2dpModule* aModule) + : mModule(aModule) +{ } + +BluetoothDaemonA2dpInterface::~BluetoothDaemonA2dpInterface() +{ } + +class BluetoothDaemonA2dpInterface::InitResultHandler MOZ_FINAL + : public BluetoothSetupResultHandler +{ +public: + InitResultHandler(BluetoothA2dpResultHandler* aRes) + : mRes(aRes) + { + MOZ_ASSERT(mRes); + } + + void OnError(BluetoothStatus aStatus) MOZ_OVERRIDE + { + MOZ_ASSERT(NS_IsMainThread()); + + mRes->OnError(aStatus); + } + + void RegisterModule() MOZ_OVERRIDE + { + MOZ_ASSERT(NS_IsMainThread()); + + mRes->Init(); + } + +private: + nsRefPtr mRes; +}; + +void +BluetoothDaemonA2dpInterface::Init( + BluetoothA2dpNotificationHandler* aNotificationHandler, + BluetoothA2dpResultHandler* aRes) +{ + // Set notification handler _before_ registering the module. It could + // happen that we receive notifications, before the result handler runs. + mModule->SetNotificationHandler(aNotificationHandler); + + InitResultHandler* res; + + if (aRes) { + res = new InitResultHandler(aRes); + } else { + // We don't need a result handler if the caller is not interested. + res = nullptr; + } + + nsresult rv = mModule->RegisterModule(BluetoothDaemonA2dpModule::SERVICE_ID, + 0x00, res); + if (NS_FAILED(rv) && aRes) { + DispatchError(aRes, STATUS_FAIL); + } +} + +class BluetoothDaemonA2dpInterface::CleanupResultHandler MOZ_FINAL + : public BluetoothSetupResultHandler +{ +public: + CleanupResultHandler(BluetoothDaemonA2dpModule* aModule, + BluetoothA2dpResultHandler* aRes) + : mModule(aModule) + , mRes(aRes) + { + MOZ_ASSERT(mModule); + } + + void OnError(BluetoothStatus aStatus) MOZ_OVERRIDE + { + MOZ_ASSERT(NS_IsMainThread()); + + if (mRes) { + mRes->OnError(aStatus); + } + } + + void UnregisterModule() MOZ_OVERRIDE + { + MOZ_ASSERT(NS_IsMainThread()); + + // Clear notification handler _after_ module has been + // unregistered. While unregistering the module, we might + // still receive notifications. + mModule->SetNotificationHandler(nullptr); + + if (mRes) { + mRes->Cleanup(); + } + } + +private: + BluetoothDaemonA2dpModule* mModule; + nsRefPtr mRes; +}; + +void +BluetoothDaemonA2dpInterface::Cleanup( + BluetoothA2dpResultHandler* aRes) +{ + mModule->UnregisterModule(BluetoothDaemonA2dpModule::SERVICE_ID, + new CleanupResultHandler(mModule, aRes)); +} + +/* Connect / Disconnect */ + +void +BluetoothDaemonA2dpInterface::Connect( + const nsAString& aBdAddr, BluetoothA2dpResultHandler* aRes) +{ + MOZ_ASSERT(mModule); + + mModule->ConnectCmd(aBdAddr, aRes); +} + +void +BluetoothDaemonA2dpInterface::Disconnect( + const nsAString& aBdAddr, BluetoothA2dpResultHandler* aRes) +{ + MOZ_ASSERT(mModule); + + mModule->DisconnectCmd(aBdAddr, aRes); +} + +void +BluetoothDaemonA2dpInterface::DispatchError( + BluetoothA2dpResultHandler* aRes, BluetoothStatus aStatus) +{ + BluetoothResultRunnable1::Dispatch( + aRes, &BluetoothA2dpResultHandler::OnError, + ConstantInitOp1(aStatus)); +} + +END_BLUETOOTH_NAMESPACE diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.h b/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.h new file mode 100644 index 000000000000..3a70b62714e9 --- /dev/null +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonA2dpInterface.h @@ -0,0 +1,152 @@ +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_bluetooth_bluetoothdaemona2dpinterface_h +#define mozilla_dom_bluetooth_bluetoothdaemona2dpinterface_h + +#include "BluetoothDaemonHelpers.h" +#include "BluetoothInterface.h" +#include "BluetoothInterfaceHelpers.h" + +BEGIN_BLUETOOTH_NAMESPACE + +class BluetoothSetupResultHandler; + +class BluetoothDaemonA2dpModule +{ +public: + enum { + SERVICE_ID = 0x06 + }; + + enum { + OPCODE_ERROR = 0x00, + OPCODE_CONNECT = 0x01, + OPCODE_DISCONNECT = 0x02 + }; + + virtual nsresult Send(BluetoothDaemonPDU* aPDU, void* aUserData) = 0; + + virtual nsresult RegisterModule(uint8_t aId, uint8_t aMode, + BluetoothSetupResultHandler* aRes) = 0; + + virtual nsresult UnregisterModule(uint8_t aId, + BluetoothSetupResultHandler* aRes) = 0; + + void SetNotificationHandler( + BluetoothA2dpNotificationHandler* aNotificationHandler); + + // + // Commands + // + + nsresult ConnectCmd(const nsAString& aBdAddr, + BluetoothA2dpResultHandler* aRes); + nsresult DisconnectCmd(const nsAString& aBdAddr, + BluetoothA2dpResultHandler* aRes); + +protected: + nsresult Send(BluetoothDaemonPDU* aPDU, + BluetoothA2dpResultHandler* aRes); + + void HandleSvc(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, void* aUserData); + + // + // Responses + // + + typedef BluetoothResultRunnable0 + ResultRunnable; + + typedef BluetoothResultRunnable1 + ErrorRunnable; + + void ErrorRsp(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, + BluetoothA2dpResultHandler* aRes); + + void ConnectRsp(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, + BluetoothA2dpResultHandler* aRes); + + void DisconnectRsp(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, + BluetoothA2dpResultHandler* aRes); + + void HandleRsp(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, + void* aUserData); + + // + // Notifications + // + + class NotificationHandlerWrapper; + + typedef BluetoothNotificationRunnable2 + ConnectionStateNotification; + + typedef BluetoothNotificationRunnable2 + AudioStateNotification; + + class AudioStateInitOp; + class ConnectionStateInitOp; + + void ConnectionStateNtf(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU); + + void AudioStateNtf(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU); + + void HandleNtf(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, + void* aUserData); + + static BluetoothA2dpNotificationHandler* sNotificationHandler; +}; + +class BluetoothDaemonA2dpInterface MOZ_FINAL + : public BluetoothA2dpInterface +{ + class CleanupResultHandler; + class InitResultHandler; + +public: + BluetoothDaemonA2dpInterface(BluetoothDaemonA2dpModule* aModule); + ~BluetoothDaemonA2dpInterface(); + + void Init( + BluetoothA2dpNotificationHandler* aNotificationHandler, + BluetoothA2dpResultHandler* aRes); + void Cleanup(BluetoothA2dpResultHandler* aRes); + + /* Connect / Disconnect */ + + void Connect(const nsAString& aBdAddr, + BluetoothA2dpResultHandler* aRes); + void Disconnect(const nsAString& aBdAddr, + BluetoothA2dpResultHandler* aRes); + +private: + void DispatchError(BluetoothA2dpResultHandler* aRes, + BluetoothStatus aStatus); + + BluetoothDaemonA2dpModule* mModule; +}; + +END_BLUETOOTH_NAMESPACE + +#endif diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.cpp b/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.cpp index 47ddbc5b5882..992f57166e9c 100644 --- a/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.cpp +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.cpp @@ -97,6 +97,37 @@ Convert(uint8_t aIn, int& aOut) return NS_OK; } +nsresult +Convert(uint8_t aIn, BluetoothA2dpAudioState& aOut) +{ + static const BluetoothA2dpAudioState sAudioState[] = { + CONVERT(0x00, A2DP_AUDIO_STATE_REMOTE_SUSPEND), + CONVERT(0x01, A2DP_AUDIO_STATE_STOPPED), + CONVERT(0x02, A2DP_AUDIO_STATE_STARTED) + }; + if (NS_WARN_IF(aIn >= MOZ_ARRAY_LENGTH(sAudioState))) { + return NS_ERROR_ILLEGAL_VALUE; + } + aOut = sAudioState[aIn]; + return NS_OK; +} + +nsresult +Convert(uint8_t aIn, BluetoothA2dpConnectionState& aOut) +{ + static const BluetoothA2dpConnectionState sConnectionState[] = { + CONVERT(0x00, A2DP_CONNECTION_STATE_DISCONNECTED), + CONVERT(0x01, A2DP_CONNECTION_STATE_CONNECTING), + CONVERT(0x02, A2DP_CONNECTION_STATE_CONNECTED), + CONVERT(0x03, A2DP_CONNECTION_STATE_DISCONNECTING) + }; + if (NS_WARN_IF(aIn >= MOZ_ARRAY_LENGTH(sConnectionState))) { + return NS_ERROR_ILLEGAL_VALUE; + } + aOut = sConnectionState[aIn]; + return NS_OK; +} + nsresult Convert(uint8_t aIn, BluetoothAclState& aOut) { @@ -918,6 +949,20 @@ UnpackPDU(BluetoothDaemonPDU& aPDU, char& aOut) return UnpackPDU(aPDU, UnpackConversion(aOut)); } +nsresult +UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothA2dpAudioState& aOut) +{ + return UnpackPDU( + aPDU, UnpackConversion(aOut)); +} + +nsresult +UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothA2dpConnectionState& aOut) +{ + return UnpackPDU( + aPDU, UnpackConversion(aOut)); +} + nsresult UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothAclState& aOut) { diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.h b/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.h index c6940f79489a..c1cea00f6649 100644 --- a/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.h +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonHelpers.h @@ -98,6 +98,12 @@ Convert(uint8_t aIn, char& aOut); nsresult Convert(uint8_t aIn, int& aOut); +nsresult +Convert(uint8_t aIn, BluetoothA2dpAudioState& aOut); + +nsresult +Convert(uint8_t aIn, BluetoothA2dpConnectionState& aOut); + nsresult Convert(uint8_t aIn, BluetoothAclState& aOut); @@ -531,6 +537,12 @@ UnpackPDU(BluetoothDaemonPDU& aPDU, bool& aOut); nsresult UnpackPDU(BluetoothDaemonPDU& aPDU, char& aOut); +nsresult +UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothA2dpAudioState& aOut); + +nsresult +UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothA2dpConnectionState& aOut); + nsresult UnpackPDU(BluetoothDaemonPDU& aPDU, BluetoothAclState& aOut); diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.cpp b/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.cpp index cbb8e35fc2b2..c7f0e25ba0a6 100644 --- a/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.cpp +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.cpp @@ -5,6 +5,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "BluetoothDaemonInterface.h" +#include "BluetoothDaemonA2dpInterface.h" #include "BluetoothDaemonHandsfreeInterface.h" #include "BluetoothDaemonHelpers.h" #include "BluetoothDaemonSetupInterface.h" @@ -1458,6 +1459,7 @@ class BluetoothDaemonProtocol MOZ_FINAL , public BluetoothDaemonCoreModule , public BluetoothDaemonSocketModule , public BluetoothDaemonHandsfreeModule + , public BluetoothDaemonA2dpModule { public: BluetoothDaemonProtocol(BluetoothDaemonConnection* aConnection); @@ -1491,6 +1493,8 @@ private: BluetoothDaemonPDU& aPDU, void* aUserData); void HandleHandsfreeSvc(const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, void* aUserData); + void HandleA2dpSvc(const BluetoothDaemonPDUHeader& aHeader, + BluetoothDaemonPDU& aPDU, void* aUserData); BluetoothDaemonConnection* mConnection; nsTArray mUserDataQ; @@ -1559,6 +1563,14 @@ BluetoothDaemonProtocol::HandleHandsfreeSvc( BluetoothDaemonHandsfreeModule::HandleSvc(aHeader, aPDU, aUserData); } +void +BluetoothDaemonProtocol::HandleA2dpSvc( + const BluetoothDaemonPDUHeader& aHeader, BluetoothDaemonPDU& aPDU, + void* aUserData) +{ + BluetoothDaemonA2dpModule::HandleSvc(aHeader, aPDU, aUserData); +} + void BluetoothDaemonProtocol::Handle(BluetoothDaemonPDU& aPDU) { @@ -1573,7 +1585,9 @@ BluetoothDaemonProtocol::Handle(BluetoothDaemonPDU& aPDU) INIT_ARRAY_AT(0x03, nullptr), // HID host INIT_ARRAY_AT(0x04, nullptr), // PAN INIT_ARRAY_AT(BluetoothDaemonHandsfreeModule::SERVICE_ID, - &BluetoothDaemonProtocol::HandleHandsfreeSvc) + &BluetoothDaemonProtocol::HandleHandsfreeSvc), + INIT_ARRAY_AT(BluetoothDaemonA2dpModule::SERVICE_ID, + &BluetoothDaemonProtocol::HandleA2dpSvc) }; BluetoothDaemonPDUHeader header; @@ -2158,7 +2172,13 @@ BluetoothDaemonInterface::GetBluetoothHandsfreeInterface() BluetoothA2dpInterface* BluetoothDaemonInterface::GetBluetoothA2dpInterface() { - return nullptr; + if (mA2dpInterface) { + return mA2dpInterface; + } + + mA2dpInterface = new BluetoothDaemonA2dpInterface(mProtocol); + + return mA2dpInterface; } BluetoothAvrcpInterface* diff --git a/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.h b/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.h index 0fca73667672..9b05a2c5d864 100644 --- a/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.h +++ b/dom/bluetooth2/bluedroid/BluetoothDaemonInterface.h @@ -12,6 +12,7 @@ BEGIN_BLUETOOTH_NAMESPACE class BluetoothDaemonChannel; +class BluetoothDaemonA2dpInterface; class BluetoothDaemonHandsfreeInterface; class BluetoothDaemonProtocol; class BluetoothDaemonSocketInterface; @@ -128,6 +129,7 @@ private: nsAutoPtr mSocketInterface; nsAutoPtr mHandsfreeInterface; + nsAutoPtr mA2dpInterface; }; END_BLUETOOTH_NAMESPACE diff --git a/dom/bluetooth2/moz.build b/dom/bluetooth2/moz.build index f97a1aa96501..dd6894d320f0 100644 --- a/dom/bluetooth2/moz.build +++ b/dom/bluetooth2/moz.build @@ -51,6 +51,7 @@ if CONFIG['MOZ_B2G_BT']: 'bluedroid/BluetoothA2dpHALInterface.cpp', 'bluedroid/BluetoothA2dpManager.cpp', 'bluedroid/BluetoothAvrcpHALInterface.cpp', + 'bluedroid/BluetoothDaemonA2dpInterface.cpp', 'bluedroid/BluetoothDaemonHandsfreeInterface.cpp', 'bluedroid/BluetoothDaemonHelpers.cpp', 'bluedroid/BluetoothDaemonInterface.cpp', diff --git a/dom/icc/tests/marionette/head.js b/dom/icc/tests/marionette/head.js index c34d1c58ce6b..1ce0ae009030 100644 --- a/dom/icc/tests/marionette/head.js +++ b/dom/icc/tests/marionette/head.js @@ -10,14 +10,86 @@ const DEFAULT_PIN = "0000"; // The puk code hard coded in emulator is "12345678". const DEFAULT_PUK = "12345678"; -// Emulate Promise.jsm semantics. -Promise.defer = function() { return new Deferred(); } -function Deferred() { - this.promise = new Promise(function(resolve, reject) { - this.resolve = resolve; - this.reject = reject; - }.bind(this)); - Object.freeze(this); +const WHT = 0xFFFFFFFF; +const BLK = 0x000000FF; +const RED = 0xFF0000FF; +const GRN = 0x00FF00FF; +const BLU = 0x0000FFFF; +const TSP = 0; + +// Basic Image, see record number 1 in EFimg. +const BASIC_ICON = { + width: 8, + height: 8, + codingScheme: "basic", + pixels: [WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT, + BLK, BLK, BLK, BLK, BLK, BLK, WHT, WHT, + WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, + WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, + WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, + WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, + WHT, WHT, BLK, BLK, BLK, BLK, WHT, WHT, + WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT] +}; +// Color Image, see record number 3 in EFimg. +const COLOR_ICON = { + width: 8, + height: 8, + codingScheme: "color", + pixels: [BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, + BLU, RED, RED, RED, RED, RED, RED, BLU, + BLU, RED, GRN, GRN, GRN, RED, RED, BLU, + BLU, RED, RED, GRN, GRN, RED, RED, BLU, + BLU, RED, RED, GRN, GRN, RED, RED, BLU, + BLU, RED, RED, GRN, GRN, GRN, RED, BLU, + BLU, RED, RED, RED, RED, RED, RED, BLU, + BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU] +}; +// Color Image with Transparency, see record number 5 in EFimg. +const COLOR_TRANSPARENCY_ICON = { + width: 8, + height: 8, + codingScheme: "color-transparency", + pixels: [TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP, + TSP, RED, RED, RED, RED, RED, RED, TSP, + TSP, RED, GRN, GRN, GRN, RED, RED, TSP, + TSP, RED, RED, GRN, GRN, RED, RED, TSP, + TSP, RED, RED, GRN, GRN, RED, RED, TSP, + TSP, RED, RED, GRN, GRN, GRN, RED, TSP, + TSP, RED, RED, RED, RED, RED, RED, TSP, + TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP] +}; + +/** + * Helper function for checking stk icon. + */ +function isIcons(aIcons, aExpectedIcons) { + is(aIcons.length, aExpectedIcons.length, "icons.length"); + for (let i = 0; i < aIcons.length; i++) { + let icon = aIcons[i]; + let expectedIcon = aExpectedIcons[i]; + + is(icon.width, expectedIcon.width, "icon.width"); + is(icon.height, expectedIcon.height, "icon.height"); + is(icon.codingScheme, expectedIcon.codingScheme, "icon.codingScheme"); + + is(icon.pixels.length, expectedIcon.pixels.length); + for (let j = 0; j < icon.pixels.length; j++) { + is(icon.pixels[j], expectedIcon.pixels[j], "icon.pixels[" + j + "]"); + } + } +} + +/** + * Helper function for checking stk text. + */ +function isStkText(aStkText, aExpectedStkText) { + is(aStkText.text, aExpectedStkText.text, "stkText.text"); + if (aExpectedStkText.icons) { + is(aStkText.iconSelfExplanatory, aExpectedStkText.iconSelfExplanatory, + "stkText.iconSelfExplanatory"); + isIcons(aStkText.icons, aExpectedStkText.icons); + } } let _pendingEmulatorCmdCount = 0; @@ -40,22 +112,35 @@ let _pendingEmulatorCmdCount = 0; * @return A deferred promise. */ function runEmulatorCmdSafe(aCommand) { - let deferred = Promise.defer(); + return new Promise(function(aResolve, aReject) { + ++_pendingEmulatorCmdCount; + runEmulatorCmd(aCommand, function(aResult) { + --_pendingEmulatorCmdCount; - ++_pendingEmulatorCmdCount; - runEmulatorCmd(aCommand, function(aResult) { - --_pendingEmulatorCmdCount; - - ok(true, "Emulator response: " + JSON.stringify(aResult)); - if (Array.isArray(aResult) && - aResult[aResult.length - 1] === "OK") { - deferred.resolve(aResult); - } else { - deferred.reject(aResult); - } + ok(true, "Emulator response: " + JSON.stringify(aResult)); + if (Array.isArray(aResult) && + aResult[aResult.length - 1] === "OK") { + aResolve(aResult); + } else { + aReject(aResult); + } + }); }); +} - return deferred.promise; +/** + * Send stk proactive pdu. + * + * Fulfill params: (none) + * Reject params: (none) + * + * @param aPdu + * + * @return A deferred promise. + */ +function sendEmulatorStkPdu(aPdu) { + let cmd = "stk pdu " + aPdu; + return runEmulatorCmdSafe(cmd); } let workingFrame; @@ -78,46 +163,44 @@ let iccManager; * @return A deferred promise. */ function ensureIccManager(aAdditionalPermissions) { - let deferred = Promise.defer(); + return new Promise(function(aResolve, aReject) { + aAdditionalPermissions = aAdditionalPermissions || []; - aAdditionalPermissions = aAdditionalPermissions || []; + if (aAdditionalPermissions.indexOf("mobileconnection") < 0) { + aAdditionalPermissions.push("mobileconnection"); + } + let permissions = []; + for (let perm of aAdditionalPermissions) { + permissions.push({ "type": perm, "allow": 1, "context": document }); + } - if (aAdditionalPermissions.indexOf("mobileconnection") < 0) { - aAdditionalPermissions.push("mobileconnection"); - } - let permissions = []; - for (let perm of aAdditionalPermissions) { - permissions.push({ "type": perm, "allow": 1, "context": document }); - } + SpecialPowers.pushPermissions(permissions, function() { + ok(true, "permissions pushed: " + JSON.stringify(permissions)); - SpecialPowers.pushPermissions(permissions, function() { - ok(true, "permissions pushed: " + JSON.stringify(permissions)); + // Permission changes can't change existing Navigator.prototype + // objects, so grab our objects from a new Navigator. + workingFrame = document.createElement("iframe"); + workingFrame.addEventListener("load", function load() { + workingFrame.removeEventListener("load", load); - // Permission changes can't change existing Navigator.prototype - // objects, so grab our objects from a new Navigator. - workingFrame = document.createElement("iframe"); - workingFrame.addEventListener("load", function load() { - workingFrame.removeEventListener("load", load); + iccManager = workingFrame.contentWindow.navigator.mozIccManager; - iccManager = workingFrame.contentWindow.navigator.mozIccManager; + if (iccManager) { + ok(true, "navigator.mozIccManager is instance of " + iccManager.constructor); + } else { + ok(true, "navigator.mozIccManager is undefined"); + } - if (iccManager) { - ok(true, "navigator.mozIccManager is instance of " + iccManager.constructor); - } else { - ok(true, "navigator.mozIccManager is undefined"); - } + if (iccManager instanceof MozIccManager) { + aResolve(iccManager); + } else { + aReject(); + } + }); - if (iccManager instanceof MozIccManager) { - deferred.resolve(iccManager); - } else { - deferred.reject(); - } + document.body.appendChild(workingFrame); }); - - document.body.appendChild(workingFrame); }); - - return deferred.promise; } /** @@ -193,17 +276,15 @@ function setRadioEnabled(aEnabled, aServiceId) { * @return A deferred promise. */ function waitForTargetEvent(aEventTarget, aEventName, aMatchFun) { - let deferred = Promise.defer(); - - aEventTarget.addEventListener(aEventName, function onevent(aEvent) { - if (!aMatchFun || aMatchFun(aEvent)) { - aEventTarget.removeEventListener(aEventName, onevent); - ok(true, "Event '" + aEventName + "' got."); - deferred.resolve(aEvent); - } + return new Promise(function(aResolve, aReject) { + aEventTarget.addEventListener(aEventName, function onevent(aEvent) { + if (!aMatchFun || aMatchFun(aEvent)) { + aEventTarget.removeEventListener(aEventName, onevent); + ok(true, "Event '" + aEventName + "' got."); + aResolve(aEvent); + } + }); }); - - return deferred.promise; } /** diff --git a/dom/icc/tests/marionette/icc_header.js b/dom/icc/tests/marionette/icc_header.js deleted file mode 100644 index fe7ca5a8f78b..000000000000 --- a/dom/icc/tests/marionette/icc_header.js +++ /dev/null @@ -1,69 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -const {Cc: Cc, Ci: Ci, Cr: Cr, Cu: Cu} = SpecialPowers; - -SpecialPowers.addPermission("mobileconnection", true, document); - -let iccManager = navigator.mozIccManager; -ok(iccManager instanceof MozIccManager, - "iccManager is instanceof " + iccManager.constructor); - -// TODO: Bug 932650 - B2G RIL: WebIccManager API - add marionette tests for -// multi-sim -// In single sim scenario, there is only one sim card, we can use below way to -// check iccId and get icc object. But in multi-sim, the index of iccIds may -// not map to sim slot directly, we should have a better way to handle this. -let iccIds = iccManager.iccIds; -ok(Array.isArray(iccIds), "iccIds is an array"); -ok(iccIds.length > 0, "iccIds.length is " + iccIds.length); - -let iccId = iccIds[0]; -is(iccId, "89014103211118510720", "iccId is " + iccId); - -let icc = iccManager.getIccById(iccId); -ok(icc instanceof MozIcc, "icc is instanceof " + icc.constructor); - -/* Remove permission and execute finish() */ -let cleanUp = function() { - SpecialPowers.removePermission("mobileconnection", document); - finish(); -}; - -/* Helper for tasks */ -let taskHelper = { - tasks: [], - - push: function(task) { - this.tasks.push(task); - }, - - runNext: function() { - let task = this.tasks.shift(); - if (!task) { - cleanUp(); - return; - } - - if (typeof task === "function") { - task(); - } - }, -}; - -/* Helper for emulator console command */ -let emulatorHelper = { - pendingCommandCount: 0, - - sendCommand: function(cmd, callback) { - this.pendingCommandCount++; - runEmulatorCmd(cmd, function(result) { - this.pendingCommandCount--; - is(result[result.length - 1], "OK"); - - if (callback && typeof callback === "function") { - callback(result); - } - }); - }, -}; diff --git a/dom/icc/tests/marionette/manifest.ini b/dom/icc/tests/marionette/manifest.ini index eb2dded85d3f..a27eda7aab62 100644 --- a/dom/icc/tests/marionette/manifest.ini +++ b/dom/icc/tests/marionette/manifest.ini @@ -3,7 +3,6 @@ b2g = true browser = false qemu = true -[test_stk_proactive_command.js] [test_icc_contact.js] [test_icc_card_lock_get_retry_count.js] [test_icc_card_lock_change_pin.js] @@ -28,6 +27,8 @@ qemu = true [test_stk_setup_menu.js] [test_stk_setup_idle_mode_text.js] [test_stk_bip_command.js] +[test_stk_local_info.js] +[test_stk_timer_management.js] [test_icc_access_invalid_object.js] [test_icc_detected_undetected_event.js] [test_icc_match_mvno.js] diff --git a/dom/icc/tests/marionette/stk_helper.js b/dom/icc/tests/marionette/stk_helper.js deleted file mode 100644 index fa5620bd7c72..000000000000 --- a/dom/icc/tests/marionette/stk_helper.js +++ /dev/null @@ -1,140 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -MARIONETTE_TIMEOUT = 30000; - -SpecialPowers.addPermission("mobileconnection", true, document); - -const WHT = 0xFFFFFFFF; -const BLK = 0x000000FF; -const RED = 0xFF0000FF; -const GRN = 0x00FF00FF; -const BLU = 0x0000FFFF; -const TSP = 0; - -let iccManager = navigator.mozIccManager; -ok(iccManager instanceof MozIccManager, - "iccManager is instanceof " + iccManager.constructor); - -// TODO: Bug 932650 - B2G RIL: WebIccManager API - add marionette tests for -// multi-sim -// In single sim scenario, there is only one sim card, we can use below way to -// check iccId and get icc object. But in multi-sim, the index of iccIds may -// not map to sim slot directly, we should have a better way to handle this. -let iccIds = iccManager.iccIds; -ok(Array.isArray(iccIds), "iccIds is an array"); -ok(iccIds.length > 0, "iccIds.length is " + iccIds.length); - -let iccId = iccIds[0]; -is(iccId, "89014103211118510720", "iccId is " + iccId); - -let icc = iccManager.getIccById(iccId); -ok(icc instanceof MozIcc, "icc is instanceof " + icc.constructor); - - -// Basic Image, see record number 1 in EFimg. -let basicIcon = { - width: 8, - height: 8, - codingScheme: "basic", - pixels: [WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT, - BLK, BLK, BLK, BLK, BLK, BLK, WHT, WHT, - WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, - WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, - WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT, - WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT, - WHT, WHT, BLK, BLK, BLK, BLK, WHT, WHT, - WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT] -}; -// Color Image, see record number 3 in EFimg. -let colorIcon = { - width: 8, - height: 8, - codingScheme: "color", - pixels: [BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU, - BLU, RED, RED, RED, RED, RED, RED, BLU, - BLU, RED, GRN, GRN, GRN, RED, RED, BLU, - BLU, RED, RED, GRN, GRN, RED, RED, BLU, - BLU, RED, RED, GRN, GRN, RED, RED, BLU, - BLU, RED, RED, GRN, GRN, GRN, RED, BLU, - BLU, RED, RED, RED, RED, RED, RED, BLU, - BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU] -}; -// Color Image with Transparency, see record number 5 in EFimg. -let colorTransparencyIcon = { - width: 8, - height: 8, - codingScheme: "color-transparency", - pixels: [TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP, - TSP, RED, RED, RED, RED, RED, RED, TSP, - TSP, RED, GRN, GRN, GRN, RED, RED, TSP, - TSP, RED, RED, GRN, GRN, RED, RED, TSP, - TSP, RED, RED, GRN, GRN, RED, RED, TSP, - TSP, RED, RED, GRN, GRN, GRN, RED, TSP, - TSP, RED, RED, RED, RED, RED, RED, TSP, - TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP] -}; - -function isIcons(icons, expectedIcons, message) { - is(icons.length, expectedIcons.length, message); - for (let i = 0; i < icons.length; i++) { - let icon = icons[i]; - let expectedIcon = expectedIcons[i]; - - is(icon.width, expectedIcon.width, message); - is(icon.height, expectedIcon.height, message); - is(icon.codingScheme, expectedIcon.codingScheme, message); - - is(icon.pixels.length, expectedIcon.pixels.length); - for (let j = 0; j < icon.pixels.length; j++) { - is(icon.pixels[j], expectedIcon.pixels[j], message); - } - } -} - -function isStkText(stkText, expectedStkText, message) { - is(stkText.text, expectedStkText.text, message); - if (expectedStkText.icons) { - is(stkText.iconSelfExplanatory, expectedStkText.iconSelfExplanatory, message); - isIcons(stkText.icons, expectedStkText.icons, message); - } -} - -let pendingEmulatorCmdCount = 0; -function sendStkPduToEmulator(command, func, expect) { - ++pendingEmulatorCmdCount; - - runEmulatorCmd(command, function(result) { - --pendingEmulatorCmdCount; - is(result[0], "OK"); - }); - - icc.onstkcommand = function(evt) { - if (expect) { - func(evt.command, expect); - } else { - func(evt.command); - } - } -} - -function runNextTest() { - let test = tests.pop(); - if (!test) { - cleanUp(); - return; - } - - let command = "stk pdu " + test.command; - sendStkPduToEmulator(command, test.func, test.expect); -} - -function cleanUp() { - if (pendingEmulatorCmdCount) { - window.setTimeout(cleanUp, 100); - return; - } - - SpecialPowers.removePermission("mobileconnection", document); - finish(); -} diff --git a/dom/icc/tests/marionette/test_icc_access_invalid_object.js b/dom/icc/tests/marionette/test_icc_access_invalid_object.js index d55eb85ae26f..da7033a8ef4b 100644 --- a/dom/icc/tests/marionette/test_icc_access_invalid_object.js +++ b/dom/icc/tests/marionette/test_icc_access_invalid_object.js @@ -1,114 +1,101 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 30000; -MARIONETTE_HEAD_JS = "icc_header.js"; +MARIONETTE_HEAD_JS = "head.js"; -function setRadioEnabled(enabled) { - let connection = navigator.mozMobileConnections[0]; - ok(connection); +function testInvalidIccObject(aIcc) { + // Test access iccInfo. + try { + is(aIcc.iccInfo, null, "iccInfo: expect to get null"); + } catch(e) { + ok(false, "access iccInfo should not get exception"); + } - let request = connection.setRadioEnabled(enabled); + // Test access cardState. + try { + is(aIcc.cardState, null, "cardState: expect to get null"); + } catch(e) { + ok(false, "access cardState should not get exception"); + } - request.onsuccess = function onsuccess() { - log('setRadioEnabled: ' + enabled); - }; + // Test STK related function. + try { + aIcc.sendStkResponse({}, {}); + ok(false, "sendStkResponse() should get exception"); + } catch(e) {} + try { + aIcc.sendStkMenuSelection(0, false); + ok(false, "sendStkMenuSelection() should get exception"); + } catch(e) {} + try { + aIcc.sendStkTimerExpiration({}); + ok(false, "sendStkTimerExpiration() should get exception"); + } catch(e) {} + try { + aIcc.sendStkEventDownload({}); + ok(false, "sendStkEventDownload() should get exception"); + } catch(e) {} - request.onerror = function onerror() { - ok(false, "setRadioEnabled should be ok"); - }; + // Test card lock related function. + try { + aIcc.getCardLock("pin"); + ok(false, "getCardLock() should get exception"); + } catch(e) {} + try { + aIcc.unlockCardLock({}); + ok(false, "unlockCardLock() should get exception"); + } catch(e) {} + try { + aIcc.setCardLock({}); + ok(false, "setCardLock() should get exception"); + } catch(e) {} + try { + aIcc.getCardLockRetryCount("pin"); + ok(false, "getCardLockRetryCount() should get exception"); + } catch(e) {} + + // Test contact related function. + try { + aIcc.readContacts("adn"); + ok(false, "readContacts() should get exception"); + } catch(e) {} + try { + aIcc.updateContact("adn", {}); + ok(false, "updateContact() should get exception"); + } catch(e) {} + + // Test mvno function. + try { + aIcc.matchMvno("imsi"); + ok(false, "matchMvno() should get exception"); + } catch(e) {} + + // Test service state function. + return aIcc.getServiceState("fdn").then(() => { + ok(false, "getServiceState() should be rejected"); + }, () => {}); } -/* Test access invalid icc object */ -taskHelper.push(function testAccessRemovedIccObject() { - setRadioEnabled(false); - iccManager.addEventListener("iccundetected", function oniccundetected(evt) { - log("got icc undetected event"); - iccManager.removeEventListener("iccundetected", oniccundetected); - is(evt.iccId, iccId, "icc " + evt.iccId + " becomes undetected"); - - // Test access iccInfo. - try { - is(icc.iccInfo, null, "iccInfo: expect to get null"); - } catch(e) { - ok(false, "access iccInfo should not get exception"); - } - - // Test access cardState. - try { - is(icc.cardState, null, "cardState: expect to get null"); - } catch(e) { - ok(false, "access cardState should not get exception"); - } - - // Test STK related function. - try { - icc.sendStkResponse({}, {}); - ok(false, "sendStkResponse() should get exception"); - } catch(e) {} - try { - icc.sendStkMenuSelection(0, false); - ok(false, "sendStkMenuSelection() should get exception"); - } catch(e) {} - try { - icc.sendStkTimerExpiration({}); - ok(false, "sendStkTimerExpiration() should get exception"); - } catch(e) {} - try { - icc.sendStkEventDownload({}); - ok(false, "sendStkEventDownload() should get exception"); - } catch(e) {} - - // Test card lock related function. - try { - icc.getCardLock(""); - ok(false, "getCardLock() should get exception"); - } catch(e) {} - try { - icc.unlockCardLock({}); - ok(false, "unlockCardLock() should get exception"); - } catch(e) {} - try { - icc.setCardLock({}); - ok(false, "setCardLock() should get exception"); - } catch(e) {} - try { - icc.getCardLockRetryCount(""); - ok(false, "getCardLockRetryCount() should get exception"); - } catch(e) {} - - // Test contact related function. - try { - icc.readContacts(""); - ok(false, "readContacts() should get exception"); - } catch(e) {} - try { - icc.updateContact("", {}); - ok(false, "updateContact() should get exception"); - } catch(e) {} - - // Test secure element related function. - try { - icc.iccOpenChannel(""); - ok(false, "iccOpenChannel() should get exception"); - } catch(e) {} - try { - icc.iccExchangeAPDU(0, {}); - ok(false, "iccExchangeAPDU() should get exception"); - } catch(e) {} - try { - icc.iccCloseChannel(0); - ok(false, "iccCloseChannel() should get exception"); - } catch(e) {} +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + return Promise.resolve() + // Turn off radio. + .then(() => { + let promises = []; + promises.push(setRadioEnabled(false)); + promises.push(waitForTargetEvent(iccManager, "iccundetected")); + return Promise.all(promises); + }) + // Test accessing invalid icc object. + .then(() => testInvalidIccObject(icc)) // We should restore the radio status. - setRadioEnabled(true); - iccManager.addEventListener("iccdetected", function oniccdetected(evt) { - iccManager.removeEventListener("iccdetected", oniccdetected); - taskHelper.runNext(); + .then(() => { + let promises = []; + promises.push(setRadioEnabled(true)); + promises.push(waitForTargetEvent(iccManager, "iccdetected")); + return Promise.all(promises); }); - }); }); - -// Start test -taskHelper.runNext(); diff --git a/dom/icc/tests/marionette/test_icc_card_state.js b/dom/icc/tests/marionette/test_icc_card_state.js index cf6ff30ca483..5c8a179c4c93 100644 --- a/dom/icc/tests/marionette/test_icc_card_state.js +++ b/dom/icc/tests/marionette/test_icc_card_state.js @@ -1,49 +1,32 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 30000; -MARIONETTE_HEAD_JS = "icc_header.js"; +MARIONETTE_HEAD_JS = "head.js"; -function setRadioEnabled(enabled) { - let connection = navigator.mozMobileConnections[0]; - ok(connection); +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); - let request = connection.setRadioEnabled(enabled); - - request.onsuccess = function onsuccess() { - log('setRadioEnabled: ' + enabled); - }; - - request.onerror = function onerror() { - ok(false, "setRadioEnabled should be ok"); - }; -} - -/* Basic test */ -taskHelper.push(function basicTest() { + // Basic test. is(icc.cardState, "ready", "card state is " + icc.cardState); - taskHelper.runNext(); -}); -/* Test cardstatechange event by switching radio off */ -taskHelper.push(function testCardStateChange() { - // Turn off radio. - setRadioEnabled(false); - icc.addEventListener("cardstatechange", function oncardstatechange() { - log("card state changes to " + icc.cardState); - // Expect to get card state changing to null. - if (icc.cardState === null) { - icc.removeEventListener("cardstatechange", oncardstatechange); - // We should restore radio status and expect to get iccdetected event. - setRadioEnabled(true); - iccManager.addEventListener("iccdetected", function oniccdetected(evt) { - log("icc iccdetected: " + evt.iccId); - iccManager.removeEventListener("iccdetected", oniccdetected); - taskHelper.runNext(); - }); - } - }); + // Test cardstatechange event by switching radio off. + return Promise.resolve() + // Turn off radio and expect to get card state changing to null. + .then(() => { + let promises = []; + promises.push(setRadioEnabled(false)); + promises.push(waitForTargetEvent(icc, "cardstatechange", function() { + return icc.cardState === null; + })); + return Promise.all(promises); + }) + // Restore radio status and expect to get iccdetected event. + .then(() => { + let promises = []; + promises.push(setRadioEnabled(true)); + promises.push(waitForTargetEvent(iccManager, "iccdetected")); + return Promise.all(promises); + }); }); - -// Start test -taskHelper.runNext(); diff --git a/dom/icc/tests/marionette/test_icc_contact.js b/dom/icc/tests/marionette/test_icc_contact.js index 6c3ab52a9387..7f2f2fdc2688 100644 --- a/dom/icc/tests/marionette/test_icc_contact.js +++ b/dom/icc/tests/marionette/test_icc_contact.js @@ -1,120 +1,81 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 60000; -MARIONETTE_HEAD_JS = "icc_header.js"; +MARIONETTE_HEAD_JS = "head.js"; -const EMULATOR_ICCID = "89014103211118510720"; +function testReadContacts(aIcc, aType) { + log("testReadContacts: type=" + aType); + let iccId = aIcc.iccInfo.iccid; + return aIcc.readContacts(aType) + .then((aResult) => { + is(Array.isArray(aResult), true); -function testReadContacts(type) { - let request = icc.readContacts(type); - request.onsuccess = function onsuccess() { - let contacts = request.result; + is(aResult[0].name[0], "Mozilla"); + is(aResult[0].tel[0].value, "15555218201"); + is(aResult[0].id, iccId + "1"); - is(Array.isArray(contacts), true); + is(aResult[1].name[0], "Saßê黃"); + is(aResult[1].tel[0].value, "15555218202"); + is(aResult[1].id, iccId + "2"); - is(contacts[0].name[0], "Mozilla"); - is(contacts[0].tel[0].value, "15555218201"); - is(contacts[0].id, EMULATOR_ICCID + "1"); + is(aResult[2].name[0], "Fire 火"); + is(aResult[2].tel[0].value, "15555218203"); + is(aResult[2].id, iccId + "3"); - is(contacts[1].name[0], "Saßê黃"); - is(contacts[1].tel[0].value, "15555218202"); - is(contacts[1].id, EMULATOR_ICCID + "2"); - - is(contacts[2].name[0], "Fire 火"); - is(contacts[2].tel[0].value, "15555218203"); - is(contacts[2].id, EMULATOR_ICCID + "3"); - - is(contacts[3].name[0], "Huang 黃"); - is(contacts[3].tel[0].value, "15555218204"); - is(contacts[3].id, EMULATOR_ICCID + "4"); - - taskHelper.runNext(); - }; - - request.onerror = function onerror() { - ok(false, "Cannot get " + type + " contacts"); - taskHelper.runNext(); - }; + is(aResult[3].name[0], "Huang 黃"); + is(aResult[3].tel[0].value, "15555218204"); + is(aResult[3].id, iccId + "4"); + }, (aError) => { + ok(false, "Cannot get " + aType + " contacts"); + }); } -function testAddContact(type, pin2) { +function testAddContact(aIcc, aType, aPin2) { + log("testAddContact: type=" + aType + ", pin2=" + aPin2); let contact = new mozContact({ name: ["add"], tel: [{value: "0912345678"}], email:[] }); - let updateRequest = icc.updateContact(type, contact, pin2); + return aIcc.updateContact(aType, contact, aPin2) + .then((aResult) => { + // Get ICC contact for checking new contact + return aIcc.readContacts(aType) + .then((aResult) => { + // There are 4 SIM contacts which are harded in emulator + is(aResult.length, 5); - updateRequest.onsuccess = function onsuccess() { - let updatedContact = updateRequest.result; - ok(updatedContact, "updateContact should have retuend a mozContact."); - ok(updatedContact.id.startsWith(EMULATOR_ICCID), - "The returned mozContact has wrong id."); - - // Get ICC contact for checking new contact - - let getRequest = icc.readContacts(type); - - getRequest.onsuccess = function onsuccess() { - let contacts = getRequest.result; - - // There are 4 SIM contacts which are harded in emulator - is(contacts.length, 5); - - is(contacts[4].name[0], "add"); - is(contacts[4].tel[0].value, "0912345678"); - - taskHelper.runNext(); - }; - - getRequest.onerror = function onerror() { - ok(false, "Cannot get " + type + " contacts: " + getRequest.error.name); - taskHelper.runNext(); - }; - }; - - updateRequest.onerror = function onerror() { - if (type === "fdn" && pin2 === undefined) { - ok(updateRequest.error.name === "SimPin2", - "expected error when pin2 is not provided"); - } else { - ok(false, "Cannot add " + type + " contact: " + updateRequest.error.name); - } - taskHelper.runNext(); - }; + is(aResult[4].name[0], "add"); + is(aResult[4].tel[0].value, "0912345678"); + }, (aError) => { + ok(false, "Cannot get " + aType + " contacts: " + aError.name); + }) + }, (aError) => { + if (aType === "fdn" && aPin2 === undefined) { + ok(aError.name === "SimPin2", + "expected error when pin2 is not provided"); + } else { + ok(false, "Cannot add " + aType + " contact: " + aError.name); + } + }); } -/* Test read adn contacts */ -taskHelper.push(function testReadAdnContacts() { - testReadContacts("adn"); -}); +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); -/* Test add adn contacts */ -taskHelper.push(function testAddAdnContact() { - testAddContact("adn"); + // Test read adn contacts + return testReadContacts(icc, "adn") + // Test add adn contacts + .then(() => testAddContact(icc, "adn")) + // Test read fdn contact + .then(() => testReadContacts(icc, "fdn")) + // Test add fdn contacts + .then(() => testAddContact(icc, "fdn", "0000")) + // Test add fdn contacts without passing pin2 + .then(() => testAddContact(icc, "fdn")) + // Test read sdn contacts + .then(() => testReadContacts(icc, "sdn")); }); - -/* Test read fdn contacts */ -taskHelper.push(function testReadAdnContacts() { - testReadContacts("fdn"); -}); - -/* Test add fdn contacts */ -taskHelper.push(function testReadAdnContacts() { - testAddContact("fdn", "0000"); -}); - -/* Test add fdn contacts without passing pin2 */ -taskHelper.push(function testReadAdnContacts() { - testAddContact("fdn"); -}); - -/* Test read sdn contacts */ -taskHelper.push(function testReadSdnContacts() { - testReadContacts("sdn"); -}); - -// Start test -taskHelper.runNext(); diff --git a/dom/icc/tests/marionette/test_icc_detected_undetected_event.js b/dom/icc/tests/marionette/test_icc_detected_undetected_event.js index 8fc604bacfa9..920728e58857 100644 --- a/dom/icc/tests/marionette/test_icc_detected_undetected_event.js +++ b/dom/icc/tests/marionette/test_icc_detected_undetected_event.js @@ -1,67 +1,51 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 30000; -MARIONETTE_HEAD_JS = "icc_header.js"; +MARIONETTE_HEAD_JS = "head.js"; -let origNumICCs = iccManager.iccIds.length; +// Start tests +startTestCommon(function() { + let origNumIccs = iccManager.iccIds.length; + let icc = getMozIcc(); + let iccId = icc.iccInfo.iccid; + let mobileConnection = getMozMobileConnectionByServiceId(); -function setRadioEnabled(enabled) { - let connection = navigator.mozMobileConnections[0]; - ok(connection); + return Promise.resolve() + // Test iccundetected event. + .then(() => { + let promises = []; - let request = connection.setRadioEnabled(enabled); + promises.push(setRadioEnabled(false)); + promises.push(waitForTargetEvent(iccManager, "iccundetected").then((aEvt) => { + is(aEvt.iccId, iccId, "icc " + aEvt.iccId + " becomes undetected"); + is(iccManager.iccIds.length, origNumIccs - 1, + "iccIds.length becomes to " + iccManager.iccIds.length); + is(iccManager.getIccById(aEvt.iccId), null, + "should not get a valid icc object here"); - request.onsuccess = function onsuccess() { - log('setRadioEnabled: ' + enabled); - }; + // The mozMobileConnection.iccId should be in sync. + is(mobileConnection.iccId, null, "check mozMobileConnection.iccId"); + })); - request.onerror = function onerror() { - ok(false, "setRadioEnabled should be ok"); - }; -} + return Promise.all(promises); + }) + // Test iccdetected event. + .then(() => { + let promises = []; -/* Test iccundetected event */ -taskHelper.push(function testIccUndetectedEvent() { - setRadioEnabled(false); - iccManager.addEventListener("iccundetected", function oniccundetected(evt) { - log("got icc undetected event"); - iccManager.removeEventListener("iccundetected", oniccundetected); + promises.push(setRadioEnabled(true)); + promises.push(waitForTargetEvent(iccManager, "iccdetected").then((aEvt) => { + is(aEvt.iccId, iccId, "icc " + aEvt.iccId + " is detected"); + is(iccManager.iccIds.length, origNumIccs, + "iccIds.length becomes to " + iccManager.iccIds.length); + ok(iccManager.getIccById(aEvt.iccId) instanceof MozIcc, + "should get a valid icc object here"); - is(evt.iccId, iccId, "icc " + evt.iccId + " becomes undetected"); - is(iccManager.iccIds.length, origNumICCs - 1, - "iccIds.length becomes to " + iccManager.iccIds.length); - is(iccManager.getIccById(evt.iccId), null, - "should not get a valid icc object here"); + // The mozMobileConnection.iccId should be in sync. + is(mobileConnection.iccId, iccId, "check mozMobileConnection.iccId"); + })); - // The mozMobileConnection.iccId should be in sync. - is(navigator.mozMobileConnections[0].iccId, null, - "check mozMobileConnection.iccId"); - - taskHelper.runNext(); - }); + return Promise.all(promises); + }); }); - -/* Test iccdetected event */ -taskHelper.push(function testIccDetectedEvent() { - setRadioEnabled(true); - iccManager.addEventListener("iccdetected", function oniccdetected(evt) { - log("got icc detected event"); - iccManager.removeEventListener("iccdetected", oniccdetected); - - is(evt.iccId, iccId, "icc " + evt.iccId + " is detected"); - is(iccManager.iccIds.length, origNumICCs, - "iccIds.length becomes to " + iccManager.iccIds.length); - ok(iccManager.getIccById(evt.iccId) instanceof MozIcc, - "should get a valid icc object here"); - - // The mozMobileConnection.iccId should be in sync. - is(navigator.mozMobileConnections[0].iccId, iccId, - "check mozMobileConnection.iccId"); - - taskHelper.runNext(); - }); -}); - -// Start test -taskHelper.runNext(); diff --git a/dom/icc/tests/marionette/test_icc_info.js b/dom/icc/tests/marionette/test_icc_info.js index a74b79884282..4e1f8400c10a 100644 --- a/dom/icc/tests/marionette/test_icc_info.js +++ b/dom/icc/tests/marionette/test_icc_info.js @@ -1,35 +1,12 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 30000; -MARIONETTE_HEAD_JS = "icc_header.js"; - -function setRadioEnabled(enabled) { - let connection = navigator.mozMobileConnections[0]; - ok(connection); - - let request = connection.setRadioEnabled(enabled); - - request.onsuccess = function onsuccess() { - log('setRadioEnabled: ' + enabled); - }; - - request.onerror = function onerror() { - ok(false, "setRadioEnabled should be ok"); - }; -} - -function setEmulatorMccMnc(mcc, mnc) { - let cmd = "operator set 0 Android,Android," + mcc + mnc; - emulatorHelper.sendCommand(cmd, function(result) { - let re = new RegExp("" + mcc + mnc + "$"); - ok(result[0].match(re), "MCC/MNC should be changed."); - }); -} +MARIONETTE_HEAD_JS = "head.js"; /* Basic test */ -taskHelper.push(function basicTest() { - let iccInfo = icc.iccInfo; +function basicTest(aIcc) { + let iccInfo = aIcc.iccInfo; // The emulator's hard coded iccid value. // See it here {B2G_HOME}/external/qemu/telephony/sim_card.c#L299. @@ -44,42 +21,44 @@ taskHelper.push(function basicTest() { is(iccInfo.mcc, 310); is(iccInfo.mnc, 260); // Phone number is hardcoded in MSISDN - // See {B2G_HOME}/external/qemu/telephony/sim_card.c, in asimcard_io() + // See {B2G_HOME}/external/qemu/telephony/sim_card.c, in asimcard_io(). is(iccInfo.msisdn, "15555215554"); } else { log("Test Cdma IccInfo"); is(iccInfo.iccType, "ruim"); // MDN is hardcoded as "8587777777". // See it here {B2G_HOME}/hardware/ril/reference-ril/reference-ril.c, - // in requestCdmaSubscription() + // in requestCdmaSubscription(). is(iccInfo.mdn, "8587777777"); // PRL version is hardcoded as 1. // See it here {B2G_HOME}/hardware/ril/reference-ril/reference-ril.c, - // in requestCdmaSubscription() + // in requestCdmaSubscription(). is(iccInfo.prlVersion, 1); } +} - taskHelper.runNext(); +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + + return Promise.resolve() + // Basic test + .then(() => basicTest(icc)) + // Test iccInfo when card becomes undetected + .then(() => { + let promises = []; + promises.push(setRadioEnabled(false)); + promises.push(waitForTargetEvent(icc, "iccinfochange", function() { + // Expect iccInfo changes to null + return icc.iccInfo === null; + })); + return Promise.all(promises); + }) + // Restore radio status and expect to get iccdetected event. + .then(() => { + let promises = []; + promises.push(setRadioEnabled(true)); + promises.push(waitForTargetEvent(iccManager, "iccdetected")); + return Promise.all(promises); + }); }); - -/* Test iccInfo when card becomes undetected */ -taskHelper.push(function testCardIsNotReady() { - // Turn off radio. - setRadioEnabled(false); - icc.addEventListener("iccinfochange", function oniccinfochange() { - // Expect iccInfo changes to null - if (icc.iccInfo === null) { - icc.removeEventListener("iccinfochange", oniccinfochange); - // We should restore radio status and expect to get iccdetected event. - setRadioEnabled(true); - iccManager.addEventListener("iccdetected", function oniccdetected(evt) { - log("icc detected: " + evt.iccId); - iccManager.removeEventListener("iccdetected", oniccdetected); - taskHelper.runNext(); - }); - } - }); -}); - -// Start test -taskHelper.runNext(); diff --git a/dom/icc/tests/marionette/test_icc_match_mvno.js b/dom/icc/tests/marionette/test_icc_match_mvno.js index 2eec91218925..24f5f28b61ff 100644 --- a/dom/icc/tests/marionette/test_icc_match_mvno.js +++ b/dom/icc/tests/marionette/test_icc_match_mvno.js @@ -1,10 +1,10 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ MARIONETTE_TIMEOUT = 30000; -MARIONETTE_HEAD_JS = "icc_header.js"; +MARIONETTE_HEAD_JS = "head.js"; -let testCases = [ +const TEST_DATA = [ // mvno type, mvno data, request success, expected result // Emulator's hard coded IMSI: 310260000000000 ["imsi", "3102600", true, true ], @@ -31,36 +31,27 @@ let testCases = [ ["gid", "5a4d6c", true, false ] ]; -function matchMvno(mvnoType, mvnoData, success, expectedResult) { - log("matchMvno: " + mvnoType + ", " + mvnoData); - let request = icc.matchMvno(mvnoType, mvnoData); - request.onsuccess = function onsuccess() { - log("onsuccess: " + request.result); - ok(success, "onsuccess while error expected"); - is(request.result, expectedResult); - testMatchMvno(); - } - request.onerror = function onerror() { - log("onerror: " + request.error.name); - ok(!success, "onerror while success expected"); - is(request.error.name, expectedResult); - testMatchMvno(); - } +function testMatchMvno(aIcc, aMvnoType, aMvnoData, aSuccess, aExpectedResult) { + log("matchMvno: " + aMvnoType + ", " + aMvnoData); + return aIcc.matchMvno(aMvnoType, aMvnoData) + .then((aResult) => { + log("onsuccess: " + aResult); + ok(aSuccess, "onsuccess while error expected"); + is(aResult, aExpectedResult); + }, (aError) => { + log("onerror: " + aError.name); + ok(!aSuccess, "onerror while success expected"); + is(aError.name, aExpectedResult); + }); } -function testMatchMvno() { - let testCase = testCases.shift(); - if (!testCase) { - taskHelper.runNext(); - return; +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => testMatchMvno.apply(null, [icc].concat(data))); } - matchMvno(testCase[0], testCase[1], testCase[2], testCase[3]); -} - -taskHelper.push( - testMatchMvno -); - -// Start test -taskHelper.runNext(); - + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_bip_command.js b/dom/icc/tests/marionette/test_stk_bip_command.js index 567999f36e33..423108c340db 100644 --- a/dom/icc/tests/marionette/test_stk_bip_command.js +++ b/dom/icc/tests/marionette/test_stk_bip_command.js @@ -1,58 +1,65 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testBipCommand(command, expect) { - log("STK CMD " + JSON.stringify(command)); - - is(command.typeOfCommand, expect.typeOfCommand, expect.name); - is(command.options.text, expect.text, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ + // Open channel. {command: "d04f81030140018202818205074f70656e204944350702030403041f0239020578470a065465737447700272730d08f4557365724c6f670d08f4557365725077643c0301ad9c3e0521010101019e020007", - func: testBipCommand, - expect: {name: "open_channel_1", - typeOfCommand: iccManager.STK_CMD_OPEN_CHANNEL, + expect: {typeOfCommand: MozIccManager.STK_CMD_OPEN_CHANNEL, text: "Open ID", iconSelfExplanatory: true, - icons: [colorIcon, colorTransparencyIcon]}}, + icons: [COLOR_ICON, COLOR_TRANSPARENCY_ICON]}}, {command: "d0448103014001820281820500350702030403041f0239020578470a065465737447700272730d08f4557365724c6f670d08f4557365725077643c0301ad9c3e052101010101", - func: testBipCommand, - expect: {name: "open_channel_2", - typeOfCommand: iccManager.STK_CMD_OPEN_CHANNEL, + expect: {typeOfCommand: MozIccManager.STK_CMD_OPEN_CHANNEL, text: ""}}, {command: "d05381030140018202818205094f70656e2049442031350702030403041f0239020578470a065465737447700272730d08f4557365724c6f670d08f4557365725077643c0301ad9c3e052101010101d004000900b4", - func: testBipCommand, - expect: {name: "open_channel_3", - typeOfCommand: iccManager.STK_CMD_OPEN_CHANNEL, + expect: {typeOfCommand: MozIccManager.STK_CMD_OPEN_CHANNEL, text: "Open ID 1"}}, + // Close channel. {command: "d01b810301410082028121850a436c6f73652049442031d004000a00b4", - func: testBipCommand, - expect: {name: "close_channel_1", - typeOfCommand: iccManager.STK_CMD_CLOSE_CHANNEL, + expect: {typeOfCommand: MozIccManager.STK_CMD_CLOSE_CHANNEL, text: "Close ID 1"}}, + // Recive data. {command: "d022810301420082028121850e5265636569766520446174612031b701c8d004000e00b4", - func: testBipCommand, - expect: {name: "receive_data_1", - typeOfCommand: iccManager.STK_CMD_RECEIVE_DATA, + expect: {typeOfCommand: MozIccManager.STK_CMD_RECEIVE_DATA, text: "Receive Data 1"}}, + // Send data. {command: "d026810301430182028121850b53656e6420446174612031b6080001020304050607d004000b00b4", - func: testBipCommand, - expect: {name: "send_data_1", - typeOfCommand: iccManager.STK_CMD_SEND_DATA, + expect: {typeOfCommand: MozIccManager.STK_CMD_SEND_DATA, text: "Send Data 1"}}, ]; -runNextTest(); +function testBipCommand(aCommand, aExpect) { + is(aCommand.typeOfCommand, aExpect.typeOfCommand, "typeOfCommand"); + is(aCommand.options.text, aExpect.text, "options.text"); + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("bip_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testBipCommand(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_display_text.js b/dom/icc/tests/marionette/test_stk_display_text.js index 00dc789998e7..f78b82493b4c 100644 --- a/dom/icc/tests/marionette/test_stk_display_text.js +++ b/dom/icc/tests/marionette/test_stk_display_text.js @@ -1,119 +1,69 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testDisplayText(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_DISPLAY_TEXT, expect.name); - is(command.options.text, expect.text, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.userClear, expect.userClear, expect.name); - is(command.options.isHighPriority, expect.isHighPriority, expect.name); - - let duration = command.options.duration; - if (duration) { - is(duration.timeUnit, expect.duration.timeUnit, expect.name); - is(duration.timeInterval, expect.duration.timeInterval, expect.name); - } - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d01a8103012180820281028d0f04546f6f6c6b697420546573742031", - func: testDisplayText, - expect: {name: "display_text_cmd_1", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "Toolkit Test 1", userClear: true}}, {command: "d01a8103012181820281028d0f04546f6f6c6b697420546573742032", - func: testDisplayText, - expect: {name: "display_text_cmd_2", - commandQualifier: 0x81, + expect: {commandQualifier: 0x81, text: "Toolkit Test 2", isHighPriority: true, userClear: true}}, {command: "d0198103012180820281028d0e00d4f79bbd4ed341d4f29c0e9a01", - func: testDisplayText, - expect: {name: "display_text_cmd_3", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "Toolkit Test 3", userClear: true}}, {command: "d01a8103012100820281028d0f04546f6f6c6b697420546573742034", - func: testDisplayText, - expect: {name: "display_text_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test 4"}}, {command: "d081ad8103012180820281028d81a1045468697320636f6d6d616e6420696e7374727563747320746865204d4520746f20646973706c617920612074657874206d6573736167652e20497420616c6c6f7773207468652053494d20746f20646566696e6520746865207072696f72697479206f662074686174206d6573736167652c20616e6420746865207465787420737472696e6720666f726d61742e2054776f207479706573206f66207072696f", - func: testDisplayText, - expect: {name: "display_text_cmd_5", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "This command instructs the ME to display a text message. It allows the SIM to define the priority of that message, and the text string format. Two types of prio", userClear: true}}, {command: "d01a8103012180820281028d0f043c474f2d4241434b57415244533e", - func: testDisplayText, - expect: {name: "display_text_cmd_6", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "", userClear: true}}, {command: "d0248103012180820281028d1908041704140420041004120421042204120423041904220415", - func: testDisplayText, - expect: {name: "display_text_cmd_7", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "ЗДРАВСТВУЙТЕ", userClear: true}}, {command: "d0108103012180820281028d05084f60597d", - func: testDisplayText, - expect: {name: "display_text_cmd_8", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "你好", userClear: true}}, {command: "d0128103012180820281028d07080038003030eb", - func: testDisplayText, - expect: {name: "display_text_cmd_9", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "80ル", userClear: true}}, {command: "d0288103012180820281020d1d00d3309bfc06c95c301aa8e80259c3ec34b9ac07c9602f58ed159bb940", - func: testDisplayText, - expect: {name: "display_text_cmd_10", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "Saldo 2.04 E. Validez 20/05/13. ", userClear: true}}, {command: "d0198103012180820281028D0A043130205365636F6E648402010A", - func: testDisplayText, - expect: {name: "display_text_cmd_11", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "10 Second", userClear: true, - duration: {timeUnit: iccManager.STK_TIME_UNIT_SECOND, + duration: {timeUnit: MozIccManager.STK_TIME_UNIT_SECOND, timeInterval: 0x0A}}}, {command: "d01a8103012180820281028d0b0442617369632049636f6e9e020001", - func: testDisplayText, - expect: {name: "display_text_cmd_12", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, text: "Basic Icon", userClear: true, iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "D026810301210082028102" + "8D" + "1B" + "00" + // 7BIT "D4F79BBD4ED341D4F29C0E3A4A9F55A8" + "0E8687C158A09B304905", - func: testDisplayText, - expect: {name: "display_text_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x00, 7BIT"}}, {command: "D029810301210082028102" + "8D" + @@ -121,9 +71,7 @@ let tests = [ "04" + // 8BIT "546F6F6C6B697420546573742047524F" + "55503A307830302C2038424954", - func: testDisplayText, - expect: {name: "display_text_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x00, 8BIT"}}, {command: "D046810301210082028102" + "8D" + @@ -133,9 +81,7 @@ let tests = [ "0054006500730074002000470052004F" + "00550050003A0030007800300030002C" + "00200055004300530032", - func: testDisplayText, - expect: {name: "display_text_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x00, UCS2"}}, {command: "D026810301210082028102" + "8D" + @@ -143,9 +89,7 @@ let tests = [ "12" + // 7BIT + Class 2 "D4F79BBD4ED341D4F29C0E3A4A9F55A8" + "0E868FC158A09B304905", - func: testDisplayText, - expect: {name: "display_text_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x10, 7BIT"}}, {command: "D029810301210082028102" + "8D" + @@ -153,9 +97,7 @@ let tests = [ "16" + // 8BIT + Class 2 "546F6F6C6B697420546573742047524F" + "55503A307831302C2038424954", - func: testDisplayText, - expect: {name: "display_text_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x10, 8BIT"}}, {command: "D046810301210082028102" + "8D" + @@ -165,9 +107,7 @@ let tests = [ "0054006500730074002000470052004F" + "00550050003A0030007800310030002C" + "00200055004300530032", - func: testDisplayText, - expect: {name: "display_text_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0x10, UCS2"}}, {command: "D026810301210082028102" + "8D" + @@ -175,9 +115,7 @@ let tests = [ "F2" + // 7BIT + Class 2 "D4F79BBD4ED341D4F29C0E3A4A9F55A8" + "0E8637C258A09B304905", - func: testDisplayText, - expect: {name: "display_text_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0xF0, 7BIT"}}, {command: "D029810301210082028102" + "8D" + @@ -185,9 +123,7 @@ let tests = [ "F6" + // 8BIT + Class 2 "546F6F6C6B697420546573742047524F" + "55503A307846302C2038424954", - func: testDisplayText, - expect: {name: "display_text_cmd_20", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test GROUP:0xF0, 8BIT"}}, // Bug 1088573: this test case is to ensure that we provide |length| argument // in |integer| format to GsmPDUHelper.readSeptetsToString(). @@ -214,9 +150,7 @@ let tests = [ "0C8287E5207619346D1E73A0783D0D9A" + "9FCA733A885C96BFEBEC32280C9A6689" + "CE621654768382D529551A64268B2E", - func: testDisplayText, - expect: {name: "display_text_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Ce message se compose de 273 caracteres en mode " + "compresse. Ce message est affiche sur plusieurs " + "ecrans et ne doit pas etre tronque. 273 est le " + @@ -225,4 +159,48 @@ let tests = [ "deroule a SYDNEY en AUSTRALIE."}}, ]; -runNextTest(); +function testDisplayText(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_DISPLAY_TEXT, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.text, aExpect.text, "options.text"); + is(aCommand.options.userClear, aExpect.userClear, "options.userClear"); + is(aCommand.options.isHighPriority, aExpect.isHighPriority, + "options.isHighPriority"); + + if (aExpect.duration) { + let duration = aCommand.options.duration; + is(duration.timeUnit, aExpect.duration.timeUnit, + "options.duration.timeUnit"); + is(duration.timeInterval, aExpect.duration.timeInterval, + "options.duration.timeInterval"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("display_text_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testDisplayText(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_get_inkey.js b/dom/icc/tests/marionette/test_stk_get_inkey.js index cf0878f60ccb..4c90800ce91e 100644 --- a/dom/icc/tests/marionette/test_stk_get_inkey.js +++ b/dom/icc/tests/marionette/test_stk_get_inkey.js @@ -1,115 +1,106 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testGetInKey(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_GET_INKEY, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.text, expect.name); - is(command.options.isAlphabet, expect.isAlphabet, expect.name); - is(command.options.isUCS2, expect.isUCS2, expect.name); - is(command.options.isYesNoRequested, expect.isYesNoRequested, expect.name); - - let duration = command.options.duration; - if (duration) { - is(duration.timeUnit, expect.duration.timeUnit, expect.name); - is(duration.timeInterval, expect.duration.timeInterval, expect.name); - } - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d0158103012200820281828d0a04456e74657220222b22", - func: testGetInKey, - expect: {name: "get_inkey_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter \"+\""}}, {command: "d0148103012200820281828d09004537bd2c07896022", - func: testGetInKey, - expect: {name: "get_inkey_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter \"0\""}}, {command: "d01a8103012200820281828d0f043c474f2d4241434b57415244533e", - func: testGetInKey, - expect: {name: "get_inkey_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: ""}}, {command: "d0138103012200820281828d08043c41424f52543e", - func: testGetInKey, - expect: {name: "get_inkey_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: ""}}, {command: "d0158103012201820281828d0a04456e74657220227122", - func: testGetInKey, - expect: {name: "get_inkey_cmd_5", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, text: "Enter \"q\"", isAlphabet: true}}, {command: "d081ad8103012201820281828d81a104456e746572202278222e205468697320636f6d6d616e6420696e7374727563747320746865204d4520746f20646973706c617920746578742c20616e6420746f2065787065637420746865207573657220746f20656e74657220612073696e676c65206368617261637465722e20416e7920726573706f6e736520656e7465726564206279207468652075736572207368616c6c206265207061737365642074", - func: testGetInKey, - expect: {name: "get_inkey_cmd_6", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, text: "Enter \"x\". This command instructs the ME to display text, and to expect the user to enter a single character. Any response entered by the user shall be passed t", isAlphabet: true}}, {command: "d0168103012200820281828d0b043c54494d452d4f55543e", - func: testGetInKey, - expect: {name: "get_inkey_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: ""}}, {command: "d0248103012200820281828d1908041704140420041004120421042204120423041904220415", - func: testGetInKey, - expect: {name: "get_inkey_cmd_8", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "ЗДРАВСТВУЙТЕ"}}, {command: "d081998103012200820281828d818d080417041404200410041204210422041204230419042204150417041404200410041204210422041204230419042204150417041404200410041204210422041204230419042204150417041404200410041204210422041204230419042204150417041404200410041204210422041204230419042204150417041404200410041204210422041204230419", - func: testGetInKey, - expect: {name: "get_inkey_cmd_9", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "ЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙ"}}, {command: "d0118103012203820281828d0604456e746572", - func: testGetInKey, - expect: {name: "get_inkey_cmd_10", - commandQualifier: 0x03, + expect: {commandQualifier: 0x03, text: "Enter", isAlphabet: true, isUCS2: true}}, {command: "d0158103012204820281828d0a04456e74657220594553", - func: testGetInKey, - expect: {name: "get_inkey_cmd_11", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, text: "Enter YES", isYesNoRequested: true}}, {command: "d0148103012204820281828d0904456e746572204e4f", - func: testGetInKey, - expect: {name: "get_inkey_cmd_12", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, text: "Enter NO", isYesNoRequested: true}}, {command: "d0198103012200820281828d0a043c4e4f2d49434f4e3e1e020002", - func: testGetInKey, - expect: {name: "get_inkey_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, // The record number 02 in EFimg is not defined, so no icon will be // shown, but the text string should still be displayed. text: ""}}, {command: "D0198103012200820281828D0A04456E74657220222B228402010A", - func: testGetInKey, - expect: {name: "get_inkey_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter \"+\"", - duration: {timeUnit: iccManager.STK_TIME_UNIT_SECOND, + duration: {timeUnit: MozIccManager.STK_TIME_UNIT_SECOND, timeInterval: 0x0A}}}, ]; -runNextTest(); +function testGetInKey(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_GET_INKEY, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.text, aExpect.text, "options.text"); + is(aCommand.options.isAlphabet, aExpect.isAlphabet, "options.isAlphabet"); + is(aCommand.options.isUCS2, aExpect.isUCS2, "options.isUCS2"); + is(aCommand.options.isYesNoRequested, aExpect.isYesNoRequested, + "options.isYesNoRequested"); + + if (aExpect.duration) { + let duration = aCommand.options.duration; + is(duration.timeUnit, aExpect.duration.timeUnit, + "options.duration.timeUnit"); + is(duration.timeInterval, aExpect.duration.timeInterval, + "options.duration.timeInterval"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("get_inkey_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testGetInKey(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_get_input.js b/dom/icc/tests/marionette/test_stk_get_input.js index fd6ffa2d3749..312af9aab49d 100644 --- a/dom/icc/tests/marionette/test_stk_get_input.js +++ b/dom/icc/tests/marionette/test_stk_get_input.js @@ -1,183 +1,169 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testGetInput(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_GET_INPUT, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.text, expect.name); - is(command.options.minLength, expect.minLength, expect.name); - is(command.options.maxLength, expect.maxLength, expect.name); - if (command.options.defaultText) { - is(command.options.defaultText, expect.defaultText, expect.name); - } - if (command.options.isAlphabet) { - is(command.options.isAlphabet, expect.isAlphabet, expect.name); - } - if (command.options.isUCS2) { - is(command.options.isUCS2, expect.isUCS2, expect.name); - } - if (command.options.isPacked) { - is(command.options.isPacked, expect.isPacked, expect.name); - } - if (command.options.hideInput) { - is(command.options.hideInput, expect.hideInput, expect.name); - } - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d01b8103012300820281828d0c04456e74657220313233343591020505", - func: testGetInput, - expect: {name: "get_input_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter 12345", minLength: 5, maxLength: 5}}, {command: "d01a8103012308820281828d0b004537bd2c07d96eaad10a91020505", - func: testGetInput, - expect: {name: "get_input_cmd_2", - commandQualifier: 0x08, + expect: {commandQualifier: 0x08, text: "Enter 67*#+", minLength: 5, maxLength: 5, isPacked: true}}, {command: "d01b8103012301820281828d0c04456e74657220416243644591020505", - func: testGetInput, - expect: {name: "get_input_cmd_3", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, text: "Enter AbCdE", minLength: 5, maxLength: 5, isAlphabet: true}}, {command: "d0278103012304820281828d180450617373776f726420313c53454e443e3233343536373891020408", - func: testGetInput, - expect: {name: "get_input_cmd_4", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, text: "Password 12345678", minLength: 4, maxLength: 8, hideInput: true}}, {command: "d0248103012300820281828d1504456e74657220312e2e392c302e2e392c3028312991020114", - func: testGetInput, - expect: {name: "get_input_cmd_5", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter 1..9,0..9,0(1)", minLength: 1, maxLength: 20}}, {command: "d01e8103012300820281828d0f043c474f2d4241434b57415244533e91020008", - func: testGetInput, - expect: {name: "get_input_cmd_6", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "", minLength: 0, maxLength: 8}}, {command: "d0178103012300820281828d08043c41424f52543e91020008", - func: testGetInput, - expect: {name: "get_input_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "", minLength: 0, maxLength: 8}}, {command: "d081b18103012300820281828d81a1042a2a2a313131313131313131312323232a2a2a323232323232323232322323232a2a2a333333333333333333332323232a2a2a343434343434343434342323232a2a2a353535353535353535352323232a2a2a363636363636363636362323232a2a2a373737373737373737372323232a2a2a383838383838383838382323232a2a2a393939393939393939392323232a2a2a303030303030303030302323239102a0a0", - func: testGetInput, - expect: {name: "get_input_cmd_8", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "***1111111111###***2222222222###***3333333333###***4444444444###***5555555555###***6666666666###***7777777777###***8888888888###***9999999999###***0000000000###", minLength: 160, maxLength: 160}}, {command: "d0168103012300820281828d07043c53454e443e91020001", - func: testGetInput, - expect: {name: "get_input_cmd_9", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "", minLength: 0, maxLength: 1}}, {command: "d01a8103012300820281828d0b043c54494d452d4f55543e9102000a", - func: testGetInput, - expect: {name: "get_input_cmd_10", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "", minLength: 0, maxLength: 10}}, {command: "d0288103012301820281828d190804170414042004100412042104220412042304190422041591020505", - func: testGetInput, - expect: {name: "get_input_cmd_11", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, text: "ЗДРАВСТВУЙТЕ", minLength: 5, maxLength: 5, isAlphabet: true}}, {command: "d0819d8103012301820281828d818d08041704140420041004120421042204120423041904220415041704140420041004120421042204120423041904220415041704140420041004120421042204120423041904220415041704140420041004120421042204120423041904220415041704140420041004120421042204120423041904220415041704140420041004120421042204120423041991020505", - func: testGetInput, - expect: {name: "get_input_cmd_12", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, text: "ЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕЗДРАВСТВУЙ", minLength: 5, maxLength: 5, isAlphabet: true}}, {command: "d01b8103012303820281828d0c04456e7465722048656c6c6f91020c0c", - func: testGetInput, - expect: {name: "get_input_cmd_13", - commandQualifier: 0x03, + expect: {commandQualifier: 0x03, text: "Enter Hello", minLength: 12, maxLength: 12, isAlphabet: true, isUCS2: true}}, {command: "d01b8103012303820281828d0c04456e7465722048656c6c6f910205ff", - func: testGetInput, - expect: {name: "get_input_cmd_14", - commandQualifier: 0x03, + expect: {commandQualifier: 0x03, text: "Enter Hello", minLength: 5, maxLength: 0xFF, isAlphabet: true, isUCS2: true}}, {command: "d0238103012300820281828d0c04456e746572203132333435910205051706043132333435", - func: testGetInput, - expect: {name: "get_input_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter 12345", minLength: 5, maxLength: 5, defaultText: "12345"}}, {command: "d081ba8103012300820281828d0704456e7465723a9102a0a01781a1042a2a2a313131313131313131312323232a2a2a323232323232323232322323232a2a2a333333333333333333332323232a2a2a343434343434343434342323232a2a2a353535353535353535352323232a2a2a363636363636363636362323232a2a2a373737373737373737372323232a2a2a383838383838383838382323232a2a2a393939393939393939392323232a2a2a30303030303030303030232323", - func: testGetInput, - expect: {name: "get_input_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Enter:", minLength: 160, maxLength: 160, defaultText: "***1111111111###***2222222222###***3333333333###***4444444444###***5555555555###***6666666666###***7777777777###***8888888888###***9999999999###***0000000000###"}}, {command: "d01d8103012300820281828d0a043c4e4f2d49434f4e3e9102000a1e020002", - func: testGetInput, - expect: {name: "get_input_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, // The record number 02 in EFimg is not defined, so no icon will be // shown, but the text string should still be displayed. text: "", minLength: 0, maxLength: 10}}, {command: "d0208103012300820281828d0d043c42415349432d49434f4e3e9102000a1e020101", - func: testGetInput, - expect: {name: "get_input_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "", minLength: 0, maxLength: 10, iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, ]; -runNextTest(); +function testGetInput(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_GET_INPUT, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.text, aExpect.text, "options.text"); + is(aCommand.options.minLength, aExpect.minLength, "options.minLength"); + is(aCommand.options.maxLength, aExpect.maxLength, "options.maxLength"); + + if (aExpect.defaultText) { + is(aCommand.options.defaultText, aExpect.defaultText, "options.defaultText"); + } + + if (aExpect.isAlphabet) { + is(aCommand.options.isAlphabet, aExpect.isAlphabet, "options.isAlphabet"); + } + + if (aExpect.isUCS2) { + is(aCommand.options.isUCS2, aExpect.isUCS2, "options.isUCS2"); + } + + if (aExpect.isPacked) { + is(aCommand.options.isPacked, aExpect.isPacked, "options.isPacked"); + } + + if (aExpect.hideInput) { + is(aCommand.options.hideInput, aExpect.hideInput, "options.hideInput"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("get_input_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testGetInput(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_launch_browser.js b/dom/icc/tests/marionette/test_stk_launch_browser.js index 188bb5be917b..b16331b7c683 100644 --- a/dom/icc/tests/marionette/test_stk_launch_browser.js +++ b/dom/icc/tests/marionette/test_stk_launch_browser.js @@ -1,267 +1,208 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testLaunchBrowser(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_LAUNCH_BROWSER, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.url, expect.url, expect.name); - if (expect.confirmMessage) { - isStkText(command.options.confirmMessage, expect.confirmMessage, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d0188103011500820281823100050b44656661756c742055524c", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL" }}}, {command: "d01f8103011500820281823112687474703a2f2f7878782e7979792e7a7a7a0500", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "http://xxx.yyy.zzz", confirmMessage: { text: "" }}}, {command: "d00e8103011500820281823001003100", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: ""}}, {command: "d0208103011500820281823100320103" + "0d10046162632e6465662e6768692e6a6b6c", // "0D" String TLV is useless for Launch Browser. - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: ""}}, {command: "d0188103011502820281823100050b44656661756c742055524c", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_5", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "Default URL" }}}, {command: "d0188103011503820281823100050b44656661756c742055524c", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_6", - commandQualifier: 0x03, + expect: {commandQualifier: 0x03, url: "", confirmMessage: { text: "Default URL"}}}, {command: "d00b8103011500820281823100", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: ""}}, {command: "d0268103011502820281823100051980041704140420041004120421042204120423041904220415", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_8", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "ЗДРАВСТВУЙТЕ" }}}, {command: "d021810301150282028182310005104e6f742073656c66206578706c616e2e1e020101", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_9", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "Not self explan.", iconSelfExplanatory: false, - icons : [basicIcon] } + icons : [BASIC_ICON] } }}, {command: "d01d8103011502820281823100050c53656c66206578706c616e2e1e020001", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_10", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "Self explan.", iconSelfExplanatory: true, - icons : [basicIcon] } + icons : [BASIC_ICON] } }}, {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_11", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2032", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_12", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d01b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2032", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d02b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2032", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d04b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_17", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d04b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d08b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_20", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d08b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_22", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d10b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_23", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d10b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_24", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_25", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d20b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_26", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d20b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_27", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_28", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d40b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_29", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d40b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_30", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_31", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d80b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_32", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d80b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d0208103011500820281823100050d44656661756c742055524c2032d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_33", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2033", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_34", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 3" }}}, - {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d00b4", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_35", - commandQualifier: 0x00, + {command: "d0208103011500820281823100050d44656661756c742055524c2031d004000d00b4", + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 1" }}}, {command: "d01a8103011500820281823100050d44656661756c742055524c2032", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_36", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { text: "Default URL 2" }}}, - {command: "d01281030115028202818231000505804f60597d", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_37", - commandQualifier: 0x02, + {command: "d01281030115028202818231000505804f60597d", + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "你好" }}}, {command: "d010810301150282028182310005038030eb", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_38", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, url: "", confirmMessage: { text: "ル" }}}, {command: "d01281030115008202818230010031001e020001", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_39", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { iconSelfExplanatory: true, - icons: [basicIcon] }}}, + icons: [BASIC_ICON] }}}, {command: "d01281030115008202818230010031001e020003", - func: testLaunchBrowser, - expect: {name: "launch_browser_cmd_40", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, url: "", confirmMessage: { iconSelfExplanatory: true, - icons: [colorIcon] }}}, + icons: [COLOR_ICON] }}}, ]; -runNextTest(); +function testLaunchBrowser(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_LAUNCH_BROWSER, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.url, aExpect.url, "options.url"); + + if (aExpect.confirmMessage) { + isStkText(aCommand.options.confirmMessage, aExpect.confirmMessage, + "options.confirmMessage"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("launch_browser_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testLaunchBrowser(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_local_info.js b/dom/icc/tests/marionette/test_stk_local_info.js new file mode 100644 index 000000000000..e41a5ac69b1b --- /dev/null +++ b/dom/icc/tests/marionette/test_stk_local_info.js @@ -0,0 +1,56 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; + +const TEST_DATA = [ + // Location + {command: "d009810301260082028182", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_LOCAL_INFO_LOCATION_INFO, + localInfoType: MozIccManager.STK_LOCAL_INFO_LOCATION_INFO}}, + // Imei + {command: "d009810301260182028182", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_LOCAL_INFO_IMEI, + localInfoType: MozIccManager.STK_LOCAL_INFO_IMEI}}, + // Data + {command: "d009810301260382028182", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_LOCAL_INFO_DATE_TIME_ZONE, + localInfoType: MozIccManager.STK_LOCAL_INFO_DATE_TIME_ZONE}}, + // Language + {command: "d009810301260482028182", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_LOCAL_INFO_LANGUAGE, + localInfoType: MozIccManager.STK_LOCAL_INFO_LANGUAGE}}, +]; + +function testLocalInfo(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_PROVIDE_LOCAL_INFO, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.localInfoType, aExpect.localInfoType, "options.localInfoType"); +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("local_info_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testLocalInfo(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_poll_off.js b/dom/icc/tests/marionette/test_stk_poll_off.js index 8f3d32abef39..7f8025ad5119 100644 --- a/dom/icc/tests/marionette/test_stk_poll_off.js +++ b/dom/icc/tests/marionette/test_stk_poll_off.js @@ -1,21 +1,37 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testPollOff(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_POLL_OFF, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d009810301040082028182", - func: testPollOff, - expect: {name: "pull_off_cmd_1", - commandQualifier: 0x00}} + expect: {commandQualifier: 0x00}} ]; -runNextTest(); +function testPollOff(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_POLL_OFF, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("pull_off_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testPollOff(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_proactive_command.js b/dom/icc/tests/marionette/test_stk_proactive_command.js deleted file mode 100644 index c78093327df2..000000000000 --- a/dom/icc/tests/marionette/test_stk_proactive_command.js +++ /dev/null @@ -1,107 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -MARIONETTE_HEAD_JS = "stk_helper.js"; - -function testLocalInfoLocation(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_PROVIDE_LOCAL_INFO); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_LOCAL_INFO_LOCATION_INFO); - is(cmd.options.localInfoType, iccManager.STK_LOCAL_INFO_LOCATION_INFO); - - runNextTest(); -} - -function testLocalInfoImei(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_PROVIDE_LOCAL_INFO); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_LOCAL_INFO_IMEI); - is(cmd.options.localInfoType, iccManager.STK_LOCAL_INFO_IMEI); - - runNextTest(); -} - -function testLocalInfoDate(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_PROVIDE_LOCAL_INFO); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_LOCAL_INFO_DATE_TIME_ZONE); - is(cmd.options.localInfoType, iccManager.STK_LOCAL_INFO_DATE_TIME_ZONE); - - runNextTest(); -} - -function testLocalInfoLanguage(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_PROVIDE_LOCAL_INFO); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_LOCAL_INFO_LANGUAGE); - is(cmd.options.localInfoType, iccManager.STK_LOCAL_INFO_LANGUAGE); - - runNextTest(); -} - -function testRefresh(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_REFRESH); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, 0x01); - is(cmd.options, null); - - runNextTest(); -} - -function testTimerManagementStart(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_TIMER_MANAGEMENT); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_TIMER_START); - is(cmd.options.timerAction, iccManager.STK_TIMER_START); - is(cmd.options.timerId, 0x01); - is(cmd.options.timerValue, (0x01 * 60 * 60) + (0x02 * 60) + 0x03); - - runNextTest(); -} - -function testTimerManagementDeactivate(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_TIMER_MANAGEMENT); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_TIMER_DEACTIVATE); - is(cmd.options.timerAction, iccManager.STK_TIMER_DEACTIVATE); - is(cmd.options.timerId, 0x04); - - runNextTest(); -} - -function testTimerManagementGetCurrentValue(cmd) { - log("STK CMD " + JSON.stringify(cmd)); - is(cmd.typeOfCommand, iccManager.STK_CMD_TIMER_MANAGEMENT); - is(cmd.commandNumber, 0x01); - is(cmd.commandQualifier, iccManager.STK_TIMER_GET_CURRENT_VALUE); - is(cmd.options.timerAction, iccManager.STK_TIMER_GET_CURRENT_VALUE); - is(cmd.options.timerId, 0x08); - - runNextTest(); -} - -let tests = [ - {command: "d009810301260082028182", - func: testLocalInfoLocation}, - {command: "d009810301260182028182", - func: testLocalInfoImei}, - {command: "d009810301260382028182", - func: testLocalInfoDate}, - {command: "d009810301260482028182", - func: testLocalInfoLanguage}, - {command: "d011810301270082028182a40101a503102030", - func: testTimerManagementStart}, - {command: "d00c810301270182028182a40104", - func: testTimerManagementDeactivate}, - {command: "d00c810301270282028182a40108", - func: testTimerManagementGetCurrentValue}, - ]; - -runNextTest(); diff --git a/dom/icc/tests/marionette/test_stk_refresh.js b/dom/icc/tests/marionette/test_stk_refresh.js index bd1add02af18..fc73817cbf70 100644 --- a/dom/icc/tests/marionette/test_stk_refresh.js +++ b/dom/icc/tests/marionette/test_stk_refresh.js @@ -1,25 +1,39 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testRefresh(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_REFRESH, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d0108103010101820281829205013f002fe2", - func: testRefresh, - expect: {name: "refresh_cmd_1", - commandQualifier: 0x01}}, + expect: {commandQualifier: 0x01}}, {command: "d009810301010482028182", - func: testRefresh, - expect: {name: "refresh_cmd_2", - commandQualifier: 0x04}} + expect: {commandQualifier: 0x04}} ]; -runNextTest(); +function testRefresh(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_REFRESH, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("refresh_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testRefresh(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_select_item.js b/dom/icc/tests/marionette/test_stk_select_item.js index fdde025dbcaa..a3b1a2e1487d 100644 --- a/dom/icc/tests/marionette/test_stk_select_item.js +++ b/dom/icc/tests/marionette/test_stk_select_item.js @@ -1,347 +1,270 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSelectItem(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SELECT_ITEM, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.title, expect.title, expect.name); - for (let index in command.options.items) { - is(command.options.items[index].identifier, expect.items[index].identifier, expect.name); - is(command.options.items[index].text, expect.items[index].text, expect.name); - - let itemIcons = command.options.items[index].icons; - if (itemIcons) { - isIcons(itemIcons, expect.items[index].icons, expect.name); - - let iconSelfExplanatory = command.options.items[index].iconSelfExplanatory; - is(iconSelfExplanatory, expect.items[index].iconSelfExplanatory, expect.name); - } - } - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - let length = command.options.nextActionList ? command.options.nextActionList.length : 0; - for (let i = 0; i < length; i++) { - is(command.options.nextActionList[i], expect.nextActionList[i], expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d03d810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d20338f07044974656d2034", - func: testSelectItem, - expect: {name: "select_item_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}]}}, {command: "d081fc810301240082028182850a4c617267654d656e75318f05505a65726f8f044f4f6e658f044e54776f8f064d54687265658f054c466f75728f054b466976658f044a5369788f0649536576656e8f064845696768748f05474e696e658f0646416c7068618f0645427261766f8f0844436861726c69658f064344656c74618f05424563686f8f0941466f782d74726f748f0640426c61636b8f063f42726f776e8f043e5265648f073d4f72616e67658f073c59656c6c6f778f063b477265656e8f053a426c75658f073956696f6c65748f0538477265798f063757686974658f06366d696c6c698f06356d6963726f8f05346e616e6f8f05337069636f", - func: testSelectItem, - expect: {name: "select_item_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "LargeMenu1", items: [{identifier: 80, text: "Zero"}, {identifier: 79, text: "One"}, {identifier: 78, text: "Two"}, {identifier: 77, text: "Three"}, {identifier: 76, text: "Four"}, {identifier: 75, text: "Five"}, {identifier: 74, text: "Six"}, {identifier: 73, text: "Seven"}, {identifier: 72, text: "Eight"}, {identifier: 71, text: "Nine"}, {identifier: 70, text: "Alpha"}, {identifier: 69, text: "Bravo"}, {identifier: 68, text: "Charlie"}, {identifier: 67, text: "Delta"}, {identifier: 66, text: "Echo"}, {identifier: 65, text: "Fox-trot"}, {identifier: 64, text: "Black"}, {identifier: 63, text: "Brown"}, {identifier: 62, text: "Red"}, {identifier: 61, text: "Orange"}, {identifier: 60, text: "Yellow"}, {identifier: 59, text: "Green"}, {identifier: 58, text: "Blue"}, {identifier: 57, text: "Violet"}, {identifier: 56, text: "Grey"}, {identifier: 55, text: "White"}, {identifier: 54, text: "milli"}, {identifier: 53, text: "micro"}, {identifier: 52, text: "nano"}, {identifier: 51, text: "pico"}]}}, {command: "d081fb810301240082028182850a4c617267654d656e75328f1eff43616c6c20466f7277617264696e6720556e636f6e646974696f6e616c8f1dfe43616c6c20466f7277617264696e67204f6e205573657220427573798f1cfd43616c6c20466f7277617264696e67204f6e204e6f205265706c798f26fc43616c6c20466f7277617264696e67204f6e2055736572204e6f7420526561636861626c658f1efb42617272696e67204f6620416c6c204f7574676f696e672043616c6c738f2cfa42617272696e67204f6620416c6c204f7574676f696e6720496e7465726e6174696f6e616c2043616c6c738f11f9434c492050726573656e746174696f6e", - func: testSelectItem, - expect: {name: "select_item_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "LargeMenu2", items: [{identifier: 255, text: "Call Forwarding Unconditional"}, {identifier: 254, text: "Call Forwarding On User Busy"}, {identifier: 253, text: "Call Forwarding On No Reply"}, {identifier: 252, text: "Call Forwarding On User Not Reachable"}, {identifier: 251, text: "Barring Of All Outgoing Calls"}, {identifier: 250, text: "Barring Of All Outgoing International Calls"}, {identifier: 249, text: "CLI Presentation"}]}}, {command: "d022810301240082028182850b53656c656374204974656d8f04114f6e658f041254776f", - func: testSelectItem, - expect: {name: "select_item_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Select Item", items: [{identifier: 17, text: "One"}, {identifier: 18, text: "Two"}]}}, {command: "d081fd8103012400820281828581ed5468652053494d207368616c6c20737570706c79206120736574206f66206974656d732066726f6d207768696368207468652075736572206d61792063686f6f7365206f6e652e2045616368206974656d20636f6d70726973657320612073686f7274206964656e74696669657220287573656420746f20696e646963617465207468652073656c656374696f6e2920616e642061207465787420737472696e672e204f7074696f6e616c6c79207468652053494d206d617920696e636c75646520616e20616c706861206964656e7469666965722e2054686520616c706861206964656e74696669657220698f020159", - func: testSelectItem, - expect: {name: "select_item_cmd_5", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "The SIM shall supply a set of items from which the user may choose one. Each item comprises a short identifier (used to indicate the selection) and a text string. Optionally the SIM may include an alpha identifier. The alpha identifier i", items: [{identifier: 1, text: "Y"}]}}, {command: "d081f3810301240082028182850a304c617267654d656e758f1dff312043616c6c20466f727761726420556e636f6e646974696f6e616c8f1cfe322043616c6c20466f7277617264204f6e205573657220427573798f1bfd332043616c6c20466f7277617264204f6e204e6f205265706c798f25fc342043616c6c20466f7277617264204f6e2055736572204e6f7420526561636861626c658f20fb352042617272696e67204f6620416c6c204f7574676f696e672043616c6c738f24fa362042617272696e67204f6620416c6c204f7574676f696e6720496e742043616c6c738f13f93720434c492050726573656e746174696f6e", - func: testSelectItem, - expect: {name: "select_item_cmd_6", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "0LargeMenu", items: [{identifier: 255, text: "1 Call Forward Unconditional"}, {identifier: 254, text: "2 Call Forward On User Busy"}, {identifier: 253, text: "3 Call Forward On No Reply"}, {identifier: 252, text: "4 Call Forward On User Not Reachable"}, {identifier: 251, text: "5 Barring Of All Outgoing Calls"}, {identifier: 250, text: "6 Barring Of All Outgoing Int Calls"}, {identifier: 249, text: "7 CLI Presentation"}]}}, {command: "d039810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d20331803131026", - func: testSelectItem, - expect: {name: "select_item_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}], - nextActionList: [iccManager.STK_CMD_SEND_SMS, iccManager.STK_CMD_SET_UP_CALL, iccManager.STK_CMD_PROVIDE_LOCAL_INFO]}}, + nextActionList: [MozIccManager.STK_CMD_SEND_SMS, MozIccManager.STK_CMD_SET_UP_CALL, MozIccManager.STK_CMD_PROVIDE_LOCAL_INFO]}}, {command: "d037810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d2033900102", - func: testSelectItem, - expect: {name: "select_item_cmd_8", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d034810301248082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d2033", - func: testSelectItem, - expect: {name: "select_item_cmd_9", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d03e810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d20339e0201019f0401030303", - func: testSelectItem, - expect: {name: "select_item_cmd_10", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", iconSelfExplanatory: false, - icons: [basicIcon], - items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: false, icons: [colorIcon]}, - {identifier: 2, text: "Item 2", iconSelfExplanatory: false, icons: [colorIcon]}, - {identifier: 3, text: "Item 3", iconSelfExplanatory: false, icons: [colorIcon]}]}}, + icons: [BASIC_ICON], + items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: false, icons: [COLOR_ICON]}, + {identifier: 2, text: "Item 2", iconSelfExplanatory: false, icons: [COLOR_ICON]}, + {identifier: 3, text: "Item 3", iconSelfExplanatory: false, icons: [COLOR_ICON]}]}}, {command: "d03e810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d20339e0200019f0400050505", - func: testSelectItem, - expect: {name: "select_item_cmd_11", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", iconSelfExplanatory: true, - icons: [basicIcon], - items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}, - {identifier: 2, text: "Item 2", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}, - {identifier: 3, text: "Item 3", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}]}}, + icons: [BASIC_ICON], + items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}, + {identifier: 2, text: "Item 2", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}, + {identifier: 3, text: "Item 3", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}]}}, {command: "d034810301240382028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d2033", - func: testSelectItem, - expect: {name: "select_item_cmd_12", - commandQualifier: 0x03, + expect: {commandQualifier: 0x03, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d034810301240182028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d2033", - func: testSelectItem, - expect: {name: "select_item_cmd_13", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d02b810301240482028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d2032", - func: testSelectItem, - expect: {name: "select_item_cmd_14", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d030810301240082028182850a3c54494d452d4f55543e8f07014974656d20318f07024974656d20328f07034974656d2033", - func: testSelectItem, - expect: {name: "select_item_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034", - func: testSelectItem, - expect: {name: "select_item_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001001b4d108000601b4000601b4", - func: testSelectItem, - expect: {name: "select_item_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034", - func: testSelectItem, - expect: {name: "select_item_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001002b4d108000602b4000602b4", - func: testSelectItem, - expect: {name: "select_item_cmd_20", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034", - func: testSelectItem, - expect: {name: "select_item_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001004b4d108000604b4000604b4", - func: testSelectItem, - expect: {name: "select_item_cmd_22", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_23", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_24", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001008b4d108000608b4000608b4", - func: testSelectItem, - expect: {name: "select_item_cmd_25", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_26", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_27", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001010b4d108000610b4000610b4", - func: testSelectItem, - expect: {name: "select_item_cmd_28", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_29", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_30", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001020b4d108000620b4000620b4", - func: testSelectItem, - expect: {name: "select_item_cmd_31", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_32", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_33", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001040b4d108000640b4000640b4", - func: testSelectItem, - expect: {name: "select_item_cmd_34", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_35", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_36", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001080b4d108000680b4000680b4", - func: testSelectItem, - expect: {name: "select_item_cmd_37", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_38", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420338f07014974656d20358f07024974656d2036", - func: testSelectItem, - expect: {name: "select_item_cmd_39", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 3", items: [{identifier: 1, text: "Item 5"}, {identifier: 2, text: "Item 6"}]}}, {command: "d03d8103012400820281828510546f6f6c6b69742053656c65637420318f07014974656d20318f07024974656d2032d004001000b4d108000600b4000600b4", - func: testSelectItem, - expect: {name: "select_item_cmd_40", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d02d8103012400820281828510546f6f6c6b69742053656c65637420328f07014974656d20338f07024974656d2034", - func: testSelectItem, - expect: {name: "select_item_cmd_41", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select 2", items: [{identifier: 1, text: "Item 3"}, {identifier: 2, text: "Item 4"}]}}, {command: "d07e8103012400820281828519800417041404200410041204210422041204230419042204158f1c018004170414042004100412042104220412042304190422041500318f1c028004170414042004100412042104220412042304190422041500328f1c03800417041404200410041204210422041204230419042204150033", - func: testSelectItem, - expect: {name: "select_item_cmd_42", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "ЗДРАВСТВУЙТЕ", items: [{identifier: 1, text: "ЗДРАВСТВУЙТЕ1"}, {identifier: 2, text: "ЗДРАВСТВУЙТЕ2"}, {identifier: 3, text: "ЗДРАВСТВУЙТЕ3"}]}}, {command: "d053810301240082028182850f810c089794a09092a1a292a399a2958f1101810d089794a09092a1a292a399a295318f1102810d089794a09092a1a292a399a295328f1103810d089794a09092a1a292a399a29533", - func: testSelectItem, - expect: {name: "select_item_cmd_43", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "ЗДРАВСТВУЙТЕ", items: [{identifier: 1, text: "ЗДРАВСТВУЙТЕ1"}, {identifier: 2, text: "ЗДРАВСТВУЙТЕ2"}, {identifier: 3, text: "ЗДРАВСТВУЙТЕ3"}]}}, {command: "d0578103012400820281828510820c04108784908082919282938992858f1201820d0410878490808291928293899285318f1202820d0410878490808291928293899285328f1203820d041087849080829192829389928533", - func: testSelectItem, - expect: {name: "select_item_cmd_44", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "ЗДРАВСТВУЙТЕ", items: [{identifier: 1, text: "ЗДРАВСТВУЙТЕ1"}, {identifier: 2, text: "ЗДРАВСТВУЙТЕ2"}, {identifier: 3, text: "ЗДРАВСТВУЙТЕ3"}]}}, {command: "d03e810301240082028182850b805de551777bb1900962e98f080180987976ee4e008f080280987976ee4e8c8f080380987976ee4e098f080480987976ee56db", - func: testSelectItem, - expect: {name: "select_item_cmd_45", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "工具箱选择", items: [{identifier: 1, text: "项目一"}, {identifier: 2, text: "项目二"}, {identifier: 3, text: "项目三"}, {identifier: 4, text: "项目四"}]}}, {command: "d0388103012400820281828509800038003030eb00308f0a01800038003030eb00318f0a02800038003030eb00328f0a03800038003030eb0033", - func: testSelectItem, - expect: {name: "select_item_cmd_46", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "80ル0", items: [{identifier: 1, text: "80ル1"}, {identifier: 2, text: "80ル2"}, {identifier: 3, text: "80ル3"}]}}, {command: "d03081030124008202818285078104613831eb308f08018104613831eb318f08028104613831eb328f08038104613831eb33", - func: testSelectItem, - expect: {name: "select_item_cmd_47", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "81ル0", items: [{identifier: 1, text: "81ル1"}, {identifier: 2, text: "81ル2"}, {identifier: 3, text: "81ル3"}]}}, {command: "d0348103012400820281828508820430a03832cb308f0901820430a03832cb318f0902820430a03832cb328f0903820430a03832cb33", - func: testSelectItem, - expect: {name: "select_item_cmd_48", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "82ル0", items: [{identifier: 1, text: "82ル1"}, {identifier: 2, text: "82ル2"}, {identifier: 3, text: "82ル3"}]}}, {command: "d039810301240082028182850e546f6f6c6b69742053656c6563748f07014974656d20318f07024974656d20328f07034974656d20331803000081", - func: testSelectItem, - expect: {name: "select_item_cmd_49", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Select", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}], - nextActionList: [iccManager.STK_NEXT_ACTION_NULL, iccManager.STK_NEXT_ACTION_NULL, iccManager.STK_NEXT_ACTION_END_PROACTIVE_SESSION]}}, + nextActionList: [MozIccManager.STK_NEXT_ACTION_NULL, MozIccManager.STK_NEXT_ACTION_NULL, MozIccManager.STK_NEXT_ACTION_END_PROACTIVE_SESSION]}}, ]; -runNextTest(); +function testSelectItem(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SELECT_ITEM, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.title, aExpect.title, "options.title"); + + for (let index in aExpect.items) { + let item = aCommand.options.items[index]; + let itemExpect = aExpect.items[index]; + is(item.identifier, itemExpect.identifier, + "options.items[" + index + "].identifier"); + is(item.text, itemExpect.text, + "options.items[" + index + "].text"); + + if (itemExpect.icons) { + isIcons(item.icons, itemExpect.icons); + is(item.iconSelfExplanatory, itemExpect.iconSelfExplanatory, + "options.items[" + index + "].iconSelfExplanatory"); + } + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } + + if (aExpect.nextActionList) { + for (let index in aExpect.nextActionList) { + is(aCommand.options.nextActionList[index], aExpect.nextActionList[index], + "options.nextActionList[" + index + "]"); + } + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("select_item_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSelectItem(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_send_dtmf.js b/dom/icc/tests/marionette/test_stk_send_dtmf.js index 0acc02ec929b..c2ca7469efa4 100644 --- a/dom/icc/tests/marionette/test_stk_send_dtmf.js +++ b/dom/icc/tests/marionette/test_stk_send_dtmf.js @@ -1,195 +1,138 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSendDTMF(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SEND_DTMF, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.text, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d01b810301140082028183850953656e642044544d46ac052143658709", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_1_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF"}}, {command: "d010810301140082028183ac052143658709", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_1_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0138103011400820281838500ac06c1cccccccc2c", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_2_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: ""}}, {command: "d011810301140082028183ac06c1cccccccc2c", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_2_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d01d810301140082028183850a42617369632049636f6eac02c1f29e020001", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_3_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Basic Icon", iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d011810301140082028183ac02c1f29e020005", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_3_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [colorTransparencyIcon]}}, + icons: [COLOR_TRANSPARENCY_ICON]}}, {command: "d01c810301140082028183850953656e642044544d46ac02c1f29e020101", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_4_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF", iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d011810301140082028183ac02c1f29e020105", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_4_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: false, - icons: [colorTransparencyIcon]}}, + icons: [COLOR_TRANSPARENCY_ICON]}}, {command: "d028810301140082028183851980041704140420041004120421042204120423041904220415ac02c1f2", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_5_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "ЗДРАВСТВУЙТЕ"}}, {command: "d00d810301140082028183ac02c1f2", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_5_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b00b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_6_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b00b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_6_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d01d810301140082028183850b53656e642044544d462032ac052143658709", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_7_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 2"}}, - // send_dtmf_cmd_7_without_alpha_identifier has the same pdu as - // send_dtmf_cmd_1_without_alpha_identifier. {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b01b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_8_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b01b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_8_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d00400b002b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_9_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d00400b002b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_9_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b04b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_10_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b04b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_10_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462032ac052143658709d004000b00b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_11_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 2"}}, - // send_dtmf_cmd_11_without_alpha_identifier has the same pdu as - // send_dtmf_cmd_6_without_alpha_identifier. {command: "d01d810301140082028183850b53656e642044544d462033ac052143658709", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_12_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 3"}}, - // send_dtmf_cmd_12_without_alpha_identifier has the same pdu as - // send_dtmf_cmd_1_without_alpha_identifier. {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b08b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_13_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b08b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_13_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b10b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_14_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b10b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_14_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b20b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_15_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b20b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_15_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b40b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_16_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b40b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_16_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d023810301140082028183850b53656e642044544d462031ac052143658709d004000b80b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_17_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Send DTMF 1"}}, {command: "d016810301140082028183ac052143658709d004000b80b4", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_17_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0148103011400820281838505804f60597dac02c1f2", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_18_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "你好"}}, - // send_dtmf_cmd_18_without_alpha_identifier has the same pdu as - // send_dtmf_cmd_5_without_alpha_identifier. {command: "d01281030114008202818385038030ebac02c1f2", - func: testSendDTMF, - expect: {name: "send_dtmf_cmd_19_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "ル"}} - // send_dtmf_cmd_19_without_alpha_identifier has the same pdu as - // send_dtmf_cmd_5_without_alpha_identifier. ]; -runNextTest(); +function testSendDTMF(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SEND_DTMF, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + + if (aExpect.text) { + is(aCommand.options.text, aExpect.text, "options.text"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("send_dtmf_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSendDTMF(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_send_sms.js b/dom/icc/tests/marionette/test_stk_send_sms.js index 0c31c5d5992f..689b91e250b3 100644 --- a/dom/icc/tests/marionette/test_stk_send_sms.js +++ b/dom/icc/tests/marionette/test_stk_send_sms.js @@ -1,281 +1,185 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSendSMS(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SEND_SMS, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.title, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d037810301130082028183850753656e6420534d86099111223344556677f88b180100099110325476f840f40c54657374204d657373616765", - func: testSendSMS, - expect: {name: "send_sms_cmd_1_with_alpha_identifier", - commandQualifier: 0x00, - title: "Send SM"}}, + expect: {commandQualifier: 0x00, + text: "Send SM"}}, {command: "d02e81030113008202818386099111223344556677f88b180100099110325476f840f40c54657374204d657373616765", - func: testSendSMS, - expect: {name: "send_sms_cmd_1_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d032810301130182028183850753656e6420534d86099111223344556677f88b130100099110325476f840f40753656e6420534d", - func: testSendSMS, - expect: {name: "send_sms_cmd_2_with_alpha_identifier", - commandQualifier: 0x01, - title: "Send SM"}}, + expect: {commandQualifier: 0x01, + text: "Send SM"}}, {command: "d02981030113018202818386099111223344556677f88b130100099110325476f840f40753656e6420534d", - func: testSendSMS, - expect: {name: "send_sms_cmd_2_without_alpha_identifier", - commandQualifier: 0x01}}, + expect: {commandQualifier: 0x01}}, {command: "d03d810301130082028183850d53686f7274204d65737361676586099111223344556677f88b180100099110325476f840f00d53f45b4e0735cbf379f85c06", - func: testSendSMS, - expect: {name: "send_sms_cmd_3_with_alpha_identifier", - commandQualifier: 0x00, - title: "Short Message"}}, + expect: {commandQualifier: 0x00, + text: "Short Message"}}, {command: "d02e81030113008202818386099111223344556677f88b180100099110325476f840f00d53f45b4e0735cbf379f85c06", - func: testSendSMS, - expect: {name: "send_sms_cmd_3_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d081fd810301130182028183853854686520616464726573732064617461206f626a65637420686f6c6473207468652052501144657374696e6174696f6e114164647265737386099111223344556677f88b81ac0100099110325476f840f4a054776f2074797065732061726520646566696e65643a202d20412073686f7274206d65737361676520746f2062652073656e7420746f20746865206e6574776f726b20696e20616e20534d532d5355424d4954206d6573736167652c206f7220616e20534d532d434f4d4d414e44206d6573736167652c20776865726520746865207573657220646174612063616e20626520706173736564207472616e7370", - func: testSendSMS, - expect: {name: "send_sms_cmd_4_with_alpha_identifier", - commandQualifier: 0x01, - title: "The address data object holds the RP_Destination_Address"}}, + expect: {commandQualifier: 0x01, + text: "The address data object holds the RP_Destination_Address"}}, {command: "d081c381030113018202818386099111223344556677f88b81ac0100099110325476f840f4a054776f2074797065732061726520646566696e65643a202d20412073686f7274206d65737361676520746f2062652073656e7420746f20746865206e6574776f726b20696e20616e20534d532d5355424d4954206d6573736167652c206f7220616e20534d532d434f4d4d414e44206d6573736167652c20776865726520746865207573657220646174612063616e20626520706173736564207472616e7370", - func: testSendSMS, - expect: {name: "send_sms_cmd_4_without_alpha_identifier", - commandQualifier: 0x01}}, + expect: {commandQualifier: 0x01}}, {command: "d081e9810301130082028183853854686520616464726573732064617461206f626a65637420686f6c6473207468652052502044657374696e6174696f6e204164647265737386099111223344556677f88b81980100099110325476f840f0a0d4fb1b44cfc3cb7350585e0691cbe6b4bb4cd6815aa020688e7ecbe9a076793e0f9fcb20fa1b242e83e665371d447f83e8e832c85da6dfdff23528ed0685dda06973da9a5685cd2415d42ecfe7e17399057acb41613768da9cb686cf6633e82482dae5f93c7c2eb3407774595e06d1d165507d5e9683c8617a18340ebb41e232081e9ecfcb64105d1e76cfe1", - func: testSendSMS, - expect: {name: "send_sms_cmd_5_with_alpha_identifier", - commandQualifier: 0x00, - title: "The address data object holds the RP Destination Address"}}, + expect: {commandQualifier: 0x00, + text: "The address data object holds the RP Destination Address"}}, {command: "d081af81030113008202818386099111223344556677f88b81980100099110325476f840f0a0d4fb1b44cfc3cb7350585e0691cbe6b4bb4cd6815aa020688e7ecbe9a076793e0f9fcb20fa1b242e83e665371d447f83e8e832c85da6dfdff23528ed0685dda06973da9a5685cd2415d42ecfe7e17399057acb41613768da9cb686cf6633e82482dae5f93c7c2eb3407774595e06d1d165507d5e9683c8617a18340ebb41e232081e9ecfcb64105d1e76cfe1", - func: testSendSMS, - expect: {name: "send_sms_cmd_5_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d081fd8103011300820281838581e654776f2074797065732061726520646566696e65643a202d20412073686f7274206d65737361676520746f2062652073656e7420746f20746865206e6574776f726b20696e20616e20534d532d5355424d4954206d6573736167652c206f7220616e20534d532d434f4d4d414e44206d6573736167652c20776865726520746865207573657220646174612063616e20626520706173736564207472616e73706172656e746c793b202d20412073686f7274206d65737361676520746f2062652073656e7420746f20746865206e6574776f726b20696e20616e20534d532d5355424d4954208b09010002911040f00120", - func: testSendSMS, - expect: {name: "send_sms_cmd_6_with_alpha_identifier", - commandQualifier: 0x00, - title: "Two types are defined: - A short message to be sent to the network in an SMS-SUBMIT message, or an SMS-COMMAND message, where the user data can be passed transparently; - A short message to be sent to the network in an SMS-SUBMIT "}}, + expect: {commandQualifier: 0x00, + text: "Two types are defined: - A short message to be sent to the network in an SMS-SUBMIT message, or an SMS-COMMAND message, where the user data can be passed transparently; - A short message to be sent to the network in an SMS-SUBMIT "}}, {command: "d0148103011300820281838b09010002911040f00120", - func: testSendSMS, - expect: {name: "send_sms_cmd_6_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d030810301130082028183850086099111223344556677f88b180100099110325476f840f40c54657374204d657373616765", func: testSendSMS, - expect: {name: "send_sms_cmd_7_with_alpha_identifier", - commandQualifier: 0x00, - title: ""}}, - // send_sms_cmd_7_without_alpha_identifier has the same pdu as - // send_sms_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: ""}}, {command: "d05581030113008202818385198004170414042004100412042104220412042304190422041586099111223344556677f88b240100099110325476f8400818041704140420041004120421042204120423041904220415", - func: testSendSMS, - expect: {name: "send_sms_cmd_8_with_alpha_identifier", - commandQualifier: 0x00, - title: "ЗДРАВСТВУЙТЕ"}}, + expect: {commandQualifier: 0x00, + text: "ЗДРАВСТВУЙТЕ"}}, {command: "d03a81030113008202818386099111223344556677f88b240100099110325476f8400818041704140420041004120421042204120423041904220415", - func: testSendSMS, - expect: {name: "send_sms_cmd_8_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d04b810301130082028183850f810c089794a09092a1a292a399a29586099111223344556677f88b240100099110325476f8400818041704140420041004120421042204120423041904220415", - func: testSendSMS, - expect: {name: "send_sms_cmd_9_with_alpha_identifier", - commandQualifier: 0x00, - title: "ЗДРАВСТВУЙТЕ"}}, - // send_sms_cmd_9_without_alpha_identifier has the same pdu as - // send_sms_cmd_8_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "ЗДРАВСТВУЙТЕ"}}, {command: "d03b81030113008202818385074e4f2049434f4e86099111223344556677f88b180100099110325476f840f40c54657374204d6573736167659e020002", - func: testSendSMS, - expect: {name: "send_sms_cmd_10_with_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, // The record number 02 in EFimg is not defined, so no icon will be // shown, but the text string should still be displayed. - title: "NO ICON"}}, + text: "NO ICON"}}, {command: "d03281030113008202818386099111223344556677f88b180100099110325476f840f40c54657374204d6573736167659e020001", - func: testSendSMS, - expect: {name: "send_sms_cmd_10_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d03b810301130082028183850753656e6420534d86099111223344556677f88b180100099110325476f840f40c54657374204d6573736167651e020101", - func: testSendSMS, - expect: {name: "send_sms_cmd_11_with_alpha_identifier", - commandQualifier: 0x00, - title: "Send SM", + expect: {commandQualifier: 0x00, + text: "Send SM", iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d03281030113008202818386099111223344556677f88b180100099110325476f840f40c54657374204d6573736167651e020101", - func: testSendSMS, - expect: {name: "send_sms_cmd_11_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001000b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_12_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001000b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_12_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0268103011300820281838510546578742041747472696275746520328b09010002911040f00120", - func: testSendSMS, - expect: {name: "send_sms_cmd_13_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_sms_cmd_18_without_alpha_identifier has the same pdu as - // send_sms_cmd_6_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001001b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_14_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001001b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_14_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001002b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_15_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001002b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_15_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001004b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_16_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001004b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_16_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520328b09010002911040f00120d004001000b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_17_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_sms_cmd_17_without_alpha_identifier has the same pdu as - // send_sms_cmd_12_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d0268103011300820281838510546578742041747472696275746520338b09010002911040f00120", - func: testSendSMS, - expect: {name: "send_sms_cmd_18_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 3"}}, - // send_sms_cmd_18_without_alpha_identifier has the same pdu as - // send_sms_cmd_6_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 3"}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001008b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_19_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001008b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_19_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001010b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_20_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001010b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_20_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001020b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_21_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001020b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_21_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001040b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_22_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001040b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_22_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02c8103011300820281838510546578742041747472696275746520318b09010002911040f00120d004001080b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_23_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d01a8103011300820281838b09010002911040f00120d004001080b4", - func: testSendSMS, - expect: {name: "send_sms_cmd_23_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02d8103011300820281838505804e2d4e0086099111223344556677f88b100100099110325476f84008044e2d4e00", - func: testSendSMS, - expect: {name: "send_sms_cmd_24_with_alpha_identifier", - commandQualifier: 0x00, - title: "中一"}}, + expect: {commandQualifier: 0x00, + text: "中一"}}, {command: "d02681030113008202818386099111223344556677f88b100100099110325476f84008044e2d4e00", - func: testSendSMS, - expect: {name: "send_sms_cmd_24_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02d810301130082028183850581029cad8086099111223344556677f88b100100099110325476f84008044e2d4e00", - func: testSendSMS, - expect: {name: "send_sms_cmd_25_with_alpha_identifier", - commandQualifier: 0x00, - title: "中一"}}, - // send_sms_cmd_25_without_alpha_identifier has the same pdu as - // send_sms_cmd_24_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "中一"}}, {command: "d02e810301130082028183850682024e00ad8086099111223344556677f88b100100099110325476f84008044e2d4e00", - func: testSendSMS, - expect: {name: "send_sms_cmd_26_with_alpha_identifier", - commandQualifier: 0x00, - title: "中一"}}, - // send_sms_cmd_26_without_alpha_identifier has the same pdu as - // send_sms_cmd_24_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "中一"}}, {command: "d0358103011300820281838509800038003030eb003086099111223344556677f88b140100099110325476f84008080038003030eb0031", - func: testSendSMS, - expect: {name: "send_sms_cmd_27_with_alpha_identifier", - commandQualifier: 0x00, - title: "80ル0"}}, + expect: {commandQualifier: 0x00, + text: "80ル0"}}, {command: "d02a81030113008202818386099111223344556677f88b140100099110325476f84008080038003030eb0031", - func: testSendSMS, - expect: {name: "send_sms_cmd_27_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d03381030113008202818385078104613831eb3186099111223344556677f88b140100099110325476f84008080038003030eb0032", - func: testSendSMS, - expect: {name: "send_sms_cmd_28_with_alpha_identifier", - commandQualifier: 0x00, - title: "81ル1"}}, + expect: {commandQualifier: 0x00, + text: "81ル1"}}, {command: "d02a81030113008202818386099111223344556677f88b140100099110325476f84008080038003030eb0032", - func: testSendSMS, - expect: {name: "send_sms_cmd_28_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0348103011300820281838508820430a03832cb3286099111223344556677f88b140100099110325476f84008080038003030eb0033", - func: testSendSMS, - expect: {name: "send_sms_cmd_29_with_alpha_identifier", - commandQualifier: 0x00, - title: "82ル2"}}, + expect: {commandQualifier: 0x00, + text: "82ル2"}}, {command: "d02a81030113008202818386099111223344556677f88b140100099110325476f84008080038003030eb0033", - func: testSendSMS, - expect: {name: "send_sms_cmd_29_without_alpha_identifier", - commandQualifier: 0x00}} + expect: {commandQualifier: 0x00}} ]; -runNextTest(); +function testSendSMS(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SEND_SMS, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + + if (aExpect.text) { + is(aCommand.options.text, aExpect.text, "options.text"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("send_sms_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSendSMS(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_send_ss.js b/dom/icc/tests/marionette/test_stk_send_ss.js index 70d4eb80ebd1..cbfa8d029cd7 100644 --- a/dom/icc/tests/marionette/test_stk_send_ss.js +++ b/dom/icc/tests/marionette/test_stk_send_ss.js @@ -1,222 +1,155 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSendSS(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SEND_SS, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.title, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d029810301110082028183850c43616c6c20466f7277617264891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_1_with_alpha_identifier", - commandQualifier: 0x00, - title: "Call Forward"}}, + expect: {commandQualifier: 0x00, + text: "Call Forward"}}, {command: "d01b810301110082028183891091aa120a214365870921436587a901fb", - func: testSendSS, expect: {name: "send_ss_cmd_1_without_alpha_identifier", commandQualifier: 0x00}}, {command: "d02d810301110082028183850c43616c6c20466f7277617264891491aa120a21436587092143658709214365a711fb", - func: testSendSS, expect: {name: "send_ss_cmd_2_with_alpha_identifier", commandQualifier: 0x00, - title: "Call Forward"}}, + text: "Call Forward"}}, {command: "d01f810301110082028183891491aa120a21436587092143658709214365a711fb", - func: testSendSS, - expect: {name: "send_ss_cmd_2_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d081fd8103011100820281838581eb4576656e20696620746865204669786564204469616c6c696e67204e756d626572207365727669636520697320656e61626c65642c2074686520737570706c656d656e74617279207365727669636520636f6e74726f6c20737472696e6720696e636c7564656420696e207468652053454e442053532070726f61637469766520636f6d6d616e64207368616c6c206e6f7420626520636865636b656420616761696e73742074686f7365206f66207468652046444e206c6973742e2055706f6e20726563656976696e67207468697320636f6d6d616e642c20746865204d45207368616c6c20646563698904ffba13fb", - func: testSendSS, - expect: {name: "send_ss_cmd_3_with_alpha_identifier", - commandQualifier: 0x00, - title: "Even if the Fixed Dialling Number service is enabled, the supplementary service control string included in the SEND SS proactive command shall not be checked against those of the FDN list. Upon receiving this command, the ME shall deci"}}, + expect: {commandQualifier: 0x00, + text: "Even if the Fixed Dialling Number service is enabled, the supplementary service control string included in the SEND SS proactive command shall not be checked against those of the FDN list. Upon receiving this command, the ME shall deci"}}, {command: "d00f8103011100820281838904ffba13fb", - func: testSendSS, - expect: {name: "send_ss_cmd_3_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d01d8103011100820281838500891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_4_with_alpha_identifier", - commandQualifier: 0x00, - title: ""}}, - // send_ss_cmd_4_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: ""}}, {command: "d02b810301110082028183850a42617369632049636f6e891091aa120a214365870921436587a901fb9e020001", - func: testSendSS, - expect: {name: "send_ss_cmd_5_with_alpha_identifier", - commandQualifier: 0x00, - title: "Basic Icon", + expect: {commandQualifier: 0x00, + text: "Basic Icon", iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d01f810301110082028183891091aa120a214365870921436587a901fb9e020001", - func: testSendSS, - expect: {name: "send_ss_cmd_5_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d02c810301110082028183850b436f6c6f75722049636f6e891091aa120a214365870921436587a901fb9e020003", - func: testSendSS, - expect: {name: "send_ss_cmd_6_with_alpha_identifier", - commandQualifier: 0x00, - title: "Colour Icon", + expect: {commandQualifier: 0x00, + text: "Colour Icon", iconSelfExplanatory: true, - icons: [colorIcon]}}, + icons: [COLOR_ICON]}}, {command: "d01f810301110082028183891091aa120a214365870921436587a901fb9e020003", - func: testSendSS, - expect: {name: "send_ss_cmd_6_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [colorIcon]}}, + icons: [COLOR_ICON]}}, {command: "d02b810301110082028183850a42617369632049636f6e891091aa120a214365870921436587a901fb9e020101", - func: testSendSS, - expect: {name: "send_ss_cmd_7_with_alpha_identifier", - commandQualifier: 0x00, - title: "Basic Icon", + expect: {commandQualifier: 0x00, + text: "Basic Icon", iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d01f810301110082028183891091aa120a214365870921436587a901fb9e020101", - func: testSendSS, - expect: {name: "send_ss_cmd_7_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d036810301110082028183851980041704140420041004120421042204120423041904220415891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_8_with_alpha_identifier", - commandQualifier: 0x00, - title: "ЗДРАВСТВУЙТЕ"}}, - // send_ss_cmd_8_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "ЗДРАВСТВУЙТЕ"}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001000b4", - func: testSendSS, - expect: {name: "send_ss_cmd_9_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001000b4", - func: testSendSS, - expect: {name: "send_ss_cmd_9_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02d810301110082028183851054657874204174747269627574652032891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_10_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_ss_cmd_10_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001001b4", - func: testSendSS, - expect: {name: "send_ss_cmd_11_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001001b4", - func: testSendSS, - expect: {name: "send_ss_cmd_11_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001002b4", - func: testSendSS, - expect: {name: "send_ss_cmd_12_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001002b4", - func: testSendSS, - expect: {name: "send_ss_cmd_12_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001004b4", - func: testSendSS, - expect: {name: "send_ss_cmd_13_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001004b4", - func: testSendSS, - expect: {name: "send_ss_cmd_13_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652032891091aa120a214365870921436587a901fbd004001000b4", - func: testSendSS, - expect: {name: "send_ss_cmd_14_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_ss_cmd_14_without_alpha_identifier has the same pdu as - // send_ss_cmd_9_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d02d810301110082028183851054657874204174747269627574652033891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_15_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 3"}}, - // send_ss_cmd_15_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 3"}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001008b4", - func: testSendSS, - expect: {name: "send_ss_cmd_16_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001008b4", - func: testSendSS, - expect: {name: "send_ss_cmd_16_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001010b4", - func: testSendSS, - expect: {name: "send_ss_cmd_17_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001010b4", - func: testSendSS, - expect: {name: "send_ss_cmd_17_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001020b4", - func: testSendSS, - expect: {name: "send_ss_cmd_18_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001020b4", - func: testSendSS, - expect: {name: "send_ss_cmd_18_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001040b4", - func: testSendSS, - expect: {name: "send_ss_cmd_19_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001040b4", - func: testSendSS, - expect: {name: "send_ss_cmd_19_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d033810301110082028183851054657874204174747269627574652031891091aa120a214365870921436587a901fbd004001080b4", - func: testSendSS, - expect: {name: "send_ss_cmd_20_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d021810301110082028183891091aa120a214365870921436587a901fbd004001080b4", - func: testSendSS, - expect: {name: "send_ss_cmd_20_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0228103011100820281838505804f60597d891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_21_with_alpha_identifier", - commandQualifier: 0x00, - title: "你好"}}, - // send_ss_cmd_21_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "你好"}}, {command: "d02081030111008202818385038030eb891091aa120a214365870921436587a901fb", - func: testSendSS, - expect: {name: "send_ss_cmd_22_with_alpha_identifier", - commandQualifier: 0x00, - title: "ル"}}, - // send_ss_cmd_22_without_alpha_identifier has the same pdu as - // send_ss_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "ル"}}, ]; -runNextTest(); +function testSendSS(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SEND_SS, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + + if (aExpect.text) { + is(aCommand.options.text, aExpect.text, "options.text"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("send_ss_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSendSS(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_send_ussd.js b/dom/icc/tests/marionette/test_stk_send_ussd.js index df8293f6f661..976c7436be0c 100644 --- a/dom/icc/tests/marionette/test_stk_send_ussd.js +++ b/dom/icc/tests/marionette/test_stk_send_ussd.js @@ -1,229 +1,156 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSendUSSD(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SEND_USSD, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.title, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d050810301120082028183850a372d62697420555353448a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_1_with_alpha_identifier", - commandQualifier: 0x00, - title: "7-bit USSD"}}, + expect: {commandQualifier: 0x00, + text: "7-bit USSD"}}, {command: "d0448103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_1_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d058810301120082028183850a382d62697420555353448a41444142434445464748494a4b4c4d4e4f505152535455565758595a2d6162636465666768696a6b6c6d6e6f707172737475767778797a2d31323334353637383930", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_2_with_alpha_identifier", - commandQualifier: 0x00, - title: "8-bit USSD"}}, + expect: {commandQualifier: 0x00, + text: "8-bit USSD"}}, {command: "d04c8103011200820281838a41444142434445464748494a4b4c4d4e4f505152535455565758595a2d6162636465666768696a6b6c6d6e6f707172737475767778797a2d31323334353637383930", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_2_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d02f81030112008202818385095543533220555353448a1948041704140420041004120421042204120423041904220415", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_3_with_alpha_identifier", - commandQualifier: 0x00, - title: "UCS2 USSD"}}, + expect: {commandQualifier: 0x00, + text: "UCS2 USSD"}}, {command: "d0248103011200820281838a1948041704140420041004120421042204120423041904220415", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_3_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d081fd8103011200820281838581b66f6e636520612052454c4541534520434f4d504c455445206d65737361676520636f6e7461696e696e672074686520555353442052657475726e20526573756c74206d657373616765206e6f7420636f6e7461696e696e6720616e206572726f7220686173206265656e2072656365697665642066726f6d20746865206e6574776f726b2c20746865204d45207368616c6c20696e666f726d207468652053494d20746861742074686520636f6d6d616e64206861738a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_4_with_alpha_identifier", - commandQualifier: 0x00, - title: "once a RELEASE COMPLETE message containing the USSD Return Result message not containing an error has been received from the network, the ME shall inform the SIM that the command has"}}, - // send_ussd_cmd_4_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "once a RELEASE COMPLETE message containing the USSD Return Result message not containing an error has been received from the network, the ME shall inform the SIM that the command has"}}, {command: "d04681030112008202818385008a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_5_with_alpha_identifier", - commandQualifier: 0x00, - title: ""}}, - // send_ussd_cmd_5_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: ""}}, {command: "d054810301120082028183850a42617369632049636f6e8a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020001", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_6_with_alpha_identifier", - commandQualifier: 0x00, - title: "Basic Icon", + expect: {commandQualifier: 0x00, + text: "Basic Icon", iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d0488103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020001", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_6_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d054810301120082028183850a436f6c6f722049636f6e8a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020003", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_7_with_alpha_identifier", - commandQualifier: 0x00, - title: "Color Icon", + expect: {commandQualifier: 0x00, + text: "Color Icon", iconSelfExplanatory: true, - icons: [colorIcon]}}, + icons: [COLOR_ICON]}}, {command: "d0488103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020003", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_7_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: true, - icons: [colorIcon]}}, + icons: [COLOR_ICON]}}, {command: "d054810301120082028183850a42617369632049636f6e8a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020101", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_8_with_alpha_identifier", - commandQualifier: 0x00, - title: "Basic Icon", + expect: {commandQualifier: 0x00, + text: "Basic Icon", iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d0488103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e5609e020101", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_8_without_alpha_identifier", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, iconSelfExplanatory: false, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d05f8103011200820281838519800417041404200410041204210422041204230419042204158a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_9_with_alpha_identifier", - commandQualifier: 0x00, - title: "ЗДРАВСТВУЙТЕ"}}, - // send_ussd_cmd_9_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "ЗДРАВСТВУЙТЕ"}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001000b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_10_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001000b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_10_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d0568103011200820281838510546578742041747472696275746520328a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_11_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_ussd_cmd_11_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001001b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_12_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001001b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_12_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001002b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_13_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001002b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_13_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001004b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_14_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001004b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_14_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520328a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001000b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_15_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 2"}}, - // send_ussd_cmd_15_without_alpha_identifier has the same pdu as - // send_ussd_cmd_10_with_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 2"}}, {command: "d0568103011200820281838510546578742041747472696275746520338a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_16_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 3"}}, - // send_ussd_cmd_16_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "Text Attribute 3"}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001008b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_17_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001008b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_17_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001010b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_18_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001010b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_18_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001020b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_19_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001020b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_19_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001040b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_20_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001040b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_20_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d05c8103011200820281838510546578742041747472696275746520318a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001080b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_21_with_alpha_identifier", - commandQualifier: 0x00, - title: "Text Attribute 1"}}, + expect: {commandQualifier: 0x00, + text: "Text Attribute 1"}}, {command: "d04a8103011200820281838a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560d004001080b4", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_21_without_alpha_identifier", - commandQualifier: 0x00}}, + expect: {commandQualifier: 0x00}}, {command: "d04b8103011200820281838505804f60597d8a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_22_with_alpha_identifier", - commandQualifier: 0x00, - title: "你好"}}, - // send_ussd_cmd_22_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "你好"}}, {command: "d04981030112008202818385038030eb8a39f041e19058341e9149e592d9743ea151e9945ab55eb1596d2b2c1e93cbe6333aad5eb3dbee373c2e9fd3ebf63b3eaf6fc564335acd76c3e560", - func: testSendUSSD, - expect: {name: "send_ussd_cmd_23_with_alpha_identifier", - commandQualifier: 0x00, - title: "ル"}}, - // send_ussd_cmd_23_without_alpha_identifier has the same pdu as - // send_ussd_cmd_1_without_alpha_identifier. + expect: {commandQualifier: 0x00, + text: "ル"}}, ]; -runNextTest(); +function testSendUSSD(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SEND_USSD, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + + if (aExpect.text) { + is(aCommand.options.text, aExpect.text, "options.text"); + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("send_ussd_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSendUSSD(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_setup_call.js b/dom/icc/tests/marionette/test_stk_setup_call.js index a1091c5d962f..c9d3342008a1 100644 --- a/dom/icc/tests/marionette/test_stk_setup_call.js +++ b/dom/icc/tests/marionette/test_stk_setup_call.js @@ -1,376 +1,301 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSetupCall(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_CALL, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.address, expect.address, expect.name); - - if (expect.confirmMessage) { - isStkText(command.options.confirmMessage, expect.confirmMessage, expect.name); - } - if (expect.callMessage) { - isStkText(command.options.callMessage, expect.callMessage, expect.name); - } - - let duration = command.options.duration; - if (duration) { - is(duration.timeUnit, expect.duration.timeUnit, expect.name); - is(duration.timeInterval, expect.duration.timeInterval, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d01e81030110008202818385084e6f7420627573798609911032042143651c2c", - func: testSetupCall, - expect: {name: "setup_call_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Not busy" }, address: "+012340123456,1,2"}}, {command: "d01d81030110028202818385074f6e20686f6c648609911032042143651c2c", - func: testSetupCall, - expect: {name: "setup_call_cmd_2", - commandQualifier: 0x02, + expect: {commandQualifier: 0x02, confirmMessage: { text: "On hold" }, address: "+012340123456,1,2"}}, {command: "d020810301100482028183850a446973636f6e6e6563748609911032042143651c2c", - func: testSetupCall, - expect: {name: "setup_call_cmd_3", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, confirmMessage: { text: "Disconnect" }, address: "+012340123456,1,2"}}, {command: "d02b81030110008202818385114361706162696c69747920636f6e6669678609911032042143651c2c870201a0", - func: testSetupCall, - expect: {name: "setup_call_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Capability config" }, address: "+012340123456,1,2"}}, {command: "d01c81030110018202818386119110325476981032547698103254769810", - func: testSetupCall, - expect: {name: "setup_call_cmd_5", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, address: "+01234567890123456789012345678901"}}, {command: "d081fd8103011001820281838581ed54687265652074797065732061726520646566696e65643a202d2073657420757020612063616c6c2c20627574206f6e6c79206966206e6f742063757272656e746c792062757379206f6e20616e6f746865722063616c6c3b202d2073657420757020612063616c6c2c2070757474696e6720616c6c206f746865722063616c6c732028696620616e7929206f6e20686f6c643b202d2073657420757020612063616c6c2c20646973636f6e6e656374696e6720616c6c206f746865722063616c6c732028696620616e79292066697273742e20466f722065616368206f662074686573652074797065732c2086029110", - func: testSetupCall, - expect: {name: "setup_call_cmd_6", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, confirmMessage: { text: "Three types are defined: - set up a call, but only if not currently busy on another call; - set up a call, putting all other calls (if any) on hold; - set up a call, disconnecting all other calls (if any) first. For each of these types, " }, address: "+01"}}, {command: "d02b810301100082028183850c43616c6c65642070617274798609911032042143651c2c880780509595959595", - func: testSetupCall, - expect: {name: "setup_call_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Called party" }, address: "+012340123456,1,2"}}, {command: "d02281030110018202818385084475726174696f6e8609911032042143651c2c8402010a", - func: testSetupCall, - expect: {name: "setup_call_cmd_8", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, confirmMessage: { text: "Duration" }, address: "+012340123456,1,2", - duration: {timeUnit: iccManager.STK_TIME_UNIT_SECOND, + duration: {timeUnit: MozIccManager.STK_TIME_UNIT_SECOND, timeInterval: 0x0A}}}, {command: "d028810301100082028183850c434f4e4649524d4154494f4e8609911032042143651c2c850443414c4c", - func: testSetupCall, - expect: {name: "setup_call_cmd_9", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION" }, callMessage: { text: "CALL" }, address: "+012340123456,1,2"}}, {command: "d03081030110008202818385165365742075702063616c6c2049636f6e20332e312e318609911032042143651c2c9e020101", - func: testSetupCall, - expect: {name: "setup_call_cmd_10", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Set up call Icon 3.1.1", iconSelfExplanatory: false, - icons: [basicIcon] }, + icons: [BASIC_ICON] }, address: "+012340123456,1,2"}}, {command: "d03081030110008202818385165365742075702063616c6c2049636f6e20332e322e318609911032042143651c2c9e020001", - func: testSetupCall, - expect: {name: "setup_call_cmd_11", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Set up call Icon 3.2.1", iconSelfExplanatory: true, - icons: [basicIcon] }, + icons: [BASIC_ICON] }, address: "+012340123456,1,2"}}, {command: "d03081030110008202818385165365742075702063616c6c2049636f6e20332e332e318609911032042143651c2c9e020103", - func: testSetupCall, - expect: {name: "setup_call_cmd_12", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Set up call Icon 3.3.1", iconSelfExplanatory: false, - icons: [colorIcon] }, + icons: [COLOR_ICON] }, address: "+012340123456,1,2"}}, {command: "d04c81030110008202818385165365742075702063616c6c2049636f6e20332e342e318609911032042143651c2c9e02000185165365742075702063616c6c2049636f6e20332e342e329e020001", - func: testSetupCall, - expect: {name: "setup_call_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Set up call Icon 3.4.1", iconSelfExplanatory: true, - icons: [basicIcon] }, + icons: [BASIC_ICON] }, callMessage: { text: "Set up call Icon 3.4.2" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032", - func: testSetupCall, - expect: {name: "setup_call_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e01b4d004000601b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032", - func: testSetupCall, - expect: {name: "setup_call_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e02b4d004000602b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032", - func: testSetupCall, - expect: {name: "setup_call_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e04b4d004000604b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_20", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_22", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e08b4d004000608b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_23", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_24", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_25", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e10b4d004000610b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_26", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_27", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_28", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e20b4d004000620b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_29", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_30", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_31", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e40b4d004000640b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_32", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_33", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_34", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e80b4d004000680b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_35", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032d004000e00b4d004000600b4", - func: testSetupCall, - expect: {name: "setup_call_cmd_36", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20338609911032042143651c2c850643414c4c2033", - func: testSetupCall, - expect: {name: "setup_call_cmd_37", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 3" }, callMessage: { text: "CALL 3" }, address: "+012340123456,1,2"}}, {command: "d038810301100082028183850e434f4e4649524d4154494f4e20318609911032042143651c2c850643414c4c2031d004000e00b4d0040006004b", - func: testSetupCall, - expect: {name: "setup_call_cmd_38", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 1" }, callMessage: { text: "CALL 1" }, address: "+012340123456,1,2"}}, {command: "d02c810301100082028183850e434f4e4649524d4154494f4e20328609911032042143651c2c850643414c4c2032", - func: testSetupCall, - expect: {name: "setup_call_cmd_39", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "CONFIRMATION 2" }, callMessage: { text: "CALL 2" }, address: "+012340123456,1,2"}}, {command: "d02d810301100082028183851980041704140420041004120421042204120423041904220415860791103204214365", - func: testSetupCall, - expect: {name: "setup_call_cmd_40", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "ЗДРАВСТВУЙТЕ" }, address: "+012340123456"}}, {command: "d04c810301100082028183851b800417041404200410041204210422041204230419042204150031860791103204214365851b800417041404200410041204210422041204230419042204150032", - func: testSetupCall, - expect: {name: "setup_call_cmd_41", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "ЗДРАВСТВУЙТЕ1" }, callMessage: { text: "ЗДРАВСТВУЙТЕ2" }, address: "+012340123456"}}, {command: "d0198103011000820281838505804e0d5fd9860791103204214365", - func: testSetupCall, - expect: {name: "setup_call_cmd_42", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "不忙" }, address: "+012340123456"}}, {command: "d022810301100082028183850580786e5b9a860791103204214365850780625375358bdd", - func: testSetupCall, - expect: {name: "setup_call_cmd_43", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "确定" }, callMessage: { text: "打电话" }, address: "+012340123456"}}, {command: "d01781030110008202818385038030eb860791103204214365", - func: testSetupCall, - expect: {name: "setup_call_cmd_44", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "ル" }, address: "+012340123456"}}, {command: "d02081030110008202818385058030eb003186079110320421436585058030eb0032", - func: testSetupCall, - expect: {name: "setup_call_cmd_45", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "ル1" }, callMessage: { text: "ル2" }, address: "+012340123456"}}, {command: "d029810301100482028182050a446973636f6e6e6563748609811032042143651c2c05074d657373616765", - func: testSetupCall, - expect: {name: "setup_call_cmd_46", - commandQualifier: 0x04, + expect: {commandQualifier: 0x04, confirmMessage: { text: "Disconnect" }, address: "012340123456,1,2", callMessage: { text: "Message"}}}, {command: "d02281030110008202818385084E6F7420627573798609911032042143651C2C8402010A", - func: testSetupCall, - expect: {name: "setup_call_cmd_47", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Not busy" }, address: "+012340123456,1,2", - duration: {timeUnit: iccManager.STK_TIME_UNIT_SECOND, + duration: {timeUnit: MozIccManager.STK_TIME_UNIT_SECOND, timeInterval: 0x0A}}}, {command: "d04c81030110008202818385165365742075702063616c6c2049636f6e20332e352e318609911032042143651c2c9e02000185165365742075702063616c6c2049636f6e20332e352e329e020103", - func: testSetupCall, - expect: {name: "setup_call_cmd_48", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { text: "Set up call Icon 3.5.1", iconSelfExplanatory: true, - icons: [basicIcon] }, + icons: [BASIC_ICON] }, callMessage: { text: "Set up call Icon 3.5.2", iconSelfExplanatory: false, - icons: [colorIcon] }, + icons: [COLOR_ICON] }, address: "+012340123456,1,2"}}, {command: "d01c8103011000820281838609911032042143651c2c9e0200019e020103", - func: testSetupCall, - expect: {name: "setup_call_cmd_49", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, confirmMessage: { iconSelfExplanatory: true, - icons: [basicIcon] }, + icons: [BASIC_ICON] }, callMessage: { iconSelfExplanatory: false, - icons: [colorIcon] }, + icons: [COLOR_ICON] }, address: "+012340123456,1,2"}}, ]; -runNextTest(); +function testSetupCall(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SET_UP_CALL, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, + "commandQualifier"); + is(aCommand.options.address, aExpect.address, + "options.address"); + + if (aExpect.confirmMessage) { + isStkText(aCommand.options.confirmMessage, aExpect.confirmMessage); + } + + if (aExpect.callMessage) { + isStkText(aCommand.options.callMessage, aExpect.callMessage); + } + + let duration = aCommand.options.duration; + if (duration) { + is(duration.timeUnit, aExpect.duration.timeUnit, "duration.timeUnit"); + is(duration.timeInterval, aExpect.duration.timeInterval, + "duration.timeInterval"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("setup_call_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSetupCall(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_setup_event_list.js b/dom/icc/tests/marionette/test_stk_setup_event_list.js index ac3033776f08..fc68ca2c805b 100644 --- a/dom/icc/tests/marionette/test_stk_setup_event_list.js +++ b/dom/icc/tests/marionette/test_stk_setup_event_list.js @@ -1,50 +1,59 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSetupEventList(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_EVENT_LIST, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - for (let index in command.options.eventList) { - is(command.options.eventList[index], expect.eventList[index], expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d00c810301050082028182990104", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: [4]}}, {command: "d00d81030105008202818299020507", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: [5, 7]}}, {command: "d00c810301050082028182990107", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: [7]}}, {command: "d00c810301050082028182990107", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: [7]}}, {command: "d00b8103010500820281829900", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_5", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: null}}, {command: "d00c810301050082028182990107", - func: testSetupEventList, - expect: {name: "setup_event_list_cmd_6", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, eventList: [7]}} ]; -runNextTest(); +function testSetupEventList(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SET_UP_EVENT_LIST, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + + for (let index in aExpect.eventList) { + is(aCommand.options.eventList[index], aExpect.eventList[index], + "options.eventList[" + index + "]"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("setup_event_list_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSetupEventList(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_setup_idle_mode_text.js b/dom/icc/tests/marionette/test_stk_setup_idle_mode_text.js index 7c7ead270194..10f3c180f0f2 100644 --- a/dom/icc/tests/marionette/test_stk_setup_idle_mode_text.js +++ b/dom/icc/tests/marionette/test_stk_setup_idle_mode_text.js @@ -1,207 +1,154 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSetupIdleModeText(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_IDLE_MODE_TEXT, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.text, expect.text, expect.name); - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d01a8103012800820281828d0f0449646c65204d6f64652054657874", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text"}}, {command: "d0188103012800820281828d0d04546f6f6c6b69742054657374", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Toolkit Test"}}, {command: "d081fd8103012800820281828d81f100547419344d3641737498cd06cdeb70383b0f0a83e8653c1d34a7cbd3ee330b7447a7c768d01c1d66b341e232889c9ec3d9e17c990c12e741747419d42c82c27350d80d4a93d96550fb4d2e83e8653c1d943683e8e832a85904a5e7a0b0985d06d1df20f21b94a6bba8e832082e2fcfcb6e7a989e7ebb41737a9e5d06a5e72076d94c0785e7a0b01b946ec3d9e576d94d0fd3d36f37885c1ea7e7e9b71b447f83e8e832a85904b5c3eeba393ca6d7e565b90b444597416932bb0c6abfc96510bd8ca783e6e8309b0d129741e4f41cce0ee7cb6450da0d0a83da61b7bb2c07d1d1613aa8ec9ed7e5e539888e0ed341ee32", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "The SIM shall supply a text string, which shall be displayed by the ME as an idle mode text if the ME is able to do it.The presentation style is left as an implementation decision to the ME manufacturer. The idle mode text shall be displayed in a manner that ensures that ne"}}, {command: "d0198103012800820281828d0a0449646c6520746578749e020001", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle text", iconSelfExplanatory: true, - icons: [basicIcon]}}, + icons: [BASIC_ICON]}}, {command: "d0198103012800820281828d0a0449646c6520746578749e020105", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_5", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle text", iconSelfExplanatory: false, - icons: [colorTransparencyIcon]}}, + icons: [COLOR_TRANSPARENCY_ICON]}}, {command: "d0198103012800820281828d0a0449646c6520746578749e020007", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_6", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle text", iconSelfExplanatory: true, - icons: [colorIcon, colorTransparencyIcon]}}, + icons: [COLOR_ICON, COLOR_TRANSPARENCY_ICON]}}, {command: "d0248103012800820281828d1908041704140420041004120421042204120423041904220415", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "ЗДРАВСТВУЙТЕ"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_8", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742032", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_9", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001001b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_10", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742032", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_11", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001002b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_12", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742032", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001004b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001008b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001010b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_20", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_22", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001020b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_23", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_24", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_25", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001040b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_26", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_27", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_28", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001080b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_29", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742032d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_30", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742033", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_31", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 3"}}, {command: "d0228103012800820281828d110449646c65204d6f646520546578742031d004001000b4", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_32", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 1"}}, {command: "d01c8103012800820281828d110449646c65204d6f646520546578742032", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_33", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "Idle Mode Text 2"}}, {command: "d0108103012800820281828d05084f60597d", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_34", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "你好"}}, {command: "d0148103012800820281828d09080038003030eb0030", - func: testSetupIdleModeText, - expect: {name: "setup_idle_mode_text_cmd_35", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, text: "80ル0"}}, ]; -runNextTest(); +function testSetupIdleModeText(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SET_UP_IDLE_MODE_TEXT, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.text, aExpect.text, "options.text"); + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("setup_idle_mode_text_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSetupIdleModeText(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_setup_menu.js b/dom/icc/tests/marionette/test_stk_setup_menu.js index 76e6625c9c8f..37db6678928f 100644 --- a/dom/icc/tests/marionette/test_stk_setup_menu.js +++ b/dom/icc/tests/marionette/test_stk_setup_menu.js @@ -1,269 +1,216 @@ /* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ + * http://creativecommons.org/publicdomain/zero/1.0/ */ -MARIONETTE_HEAD_JS = "stk_helper.js"; +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; -function testSetupMenu(command, expect) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_MENU, expect.name); - is(command.commandQualifier, expect.commandQualifier, expect.name); - is(command.options.title, expect.title, expect.name); - for (let index in command.options.items) { - is(command.options.items[index].identifier, expect.items[index].identifier, expect.name); - is(command.options.items[index].text, expect.items[index].text, expect.name); - - let itemIcons = command.options.items[index].icons; - if (itemIcons) { - isIcons(itemIcons, expect.items[index].icons, expect.name); - - let iconSelfExplanatory = command.options.items[index].iconSelfExplanatory; - is(iconSelfExplanatory, expect.items[index].iconSelfExplanatory, expect.name); - } - } - - let icons = command.options.icons; - if (icons) { - isIcons(icons, expect.icons, expect.name); - - let iconSelfExplanatory = command.options.iconSelfExplanatory; - is(iconSelfExplanatory, expect.iconSelfExplanatory, expect.name); - } - - let length = command.options.nextActionList ? command.options.nextActionList.length : 0; - for (let i = 0; i < length; i++) { - is(command.options.nextActionList[i], expect.nextActionList[i], expect.name); - } - - runNextTest(); -} - -function isFirstMenuItemNull(command) { - return (command.options.items.length == 1 && !(command.options.items[0])); -} - -function testInitialSetupMenu(command) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_MENU); - is(isFirstMenuItemNull(command), false); - - runNextTest(); -} -function testRemoveSetupMenu(command) { - log("STK CMD " + JSON.stringify(command)); - is(command.typeOfCommand, iccManager.STK_CMD_SET_UP_MENU); - is(isFirstMenuItemNull(command), true); - - runNextTest(); -} - -let tests = [ +const TEST_DATA = [ {command: "d03b810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20338f07044974656d2034", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_1", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}]}}, {command: "d023810301250082028182850c546f6f6c6b6974204d656e758f04114f6e658f041254776f", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_2", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", items: [{identifier: 17, text: "One"}, {identifier: 18, text: "Two"}]}}, {command: "d081fc810301250082028182850a4c617267654d656e75318f05505a65726f8f044f4f6e658f044e54776f8f064d54687265658f054c466f75728f054b466976658f044a5369788f0649536576656e8f064845696768748f05474e696e658f0646416c7068618f0645427261766f8f0844436861726c69658f064344656c74618f05424563686f8f0941466f782d74726f748f0640426c61636b8f063f42726f776e8f043e5265648f073d4f72616e67658f073c59656c6c6f778f063b477265656e8f053a426c75658f073956696f6c65748f0538477265798f063757686974658f06366d696c6c698f06356d6963726f8f05346e616e6f8f05337069636f", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_3", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "LargeMenu1", items: [{identifier: 80, text: "Zero"}, {identifier: 79, text: "One"}, {identifier: 78, text: "Two"}, {identifier: 77, text: "Three"}, {identifier: 76, text: "Four"}, {identifier: 75, text: "Five"}, {identifier: 74, text: "Six"}, {identifier: 73, text: "Seven"}, {identifier: 72, text: "Eight"}, {identifier: 71, text: "Nine"}, {identifier: 70, text: "Alpha"}, {identifier: 69, text: "Bravo"}, {identifier: 68, text: "Charlie"}, {identifier: 67, text: "Delta"}, {identifier: 66, text: "Echo"}, {identifier: 65, text: "Fox-trot"}, {identifier: 64, text: "Black"}, {identifier: 63, text: "Brown"}, {identifier: 62, text: "Red"}, {identifier: 61, text: "Orange"}, {identifier: 60, text: "Yellow"}, {identifier: 59, text: "Green"}, {identifier: 58, text: "Blue"}, {identifier: 57, text: "Violet"}, {identifier: 56, text: "Grey"}, {identifier: 55, text: "White"}, {identifier: 54, text: "milli"}, {identifier: 53, text: "micro"}, {identifier: 52, text: "nano"}, {identifier: 51, text: "pico"}]}}, {command: "d081f3810301250082028182850a4c617267654d656e75328f1dff312043616c6c20466f727761726420556e636f6e646974696f6e616c8f1cfe322043616c6c20466f7277617264204f6e205573657220427573798f1bfd332043616c6c20466f7277617264204f6e204e6f205265706c798f25fc342043616c6c20466f7277617264204f6e2055736572204e6f7420526561636861626c658f20fb352042617272696e67204f6620416c6c204f7574676f696e672043616c6c738f24fa362042617272696e67204f6620416c6c204f7574676f696e6720496e742043616c6c738f13f93720434c492050726573656e746174696f6e", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_4", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "LargeMenu2", items: [{identifier: 255, text: "1 Call Forward Unconditional"}, {identifier: 254, text: "2 Call Forward On User Busy"}, {identifier: 253, text: "3 Call Forward On No Reply"}, {identifier: 252, text: "4 Call Forward On User Not Reachable"}, {identifier: 251, text: "5 Barring Of All Outgoing Calls"}, {identifier: 250, text: "6 Barring Of All Outgoing Int Calls"}, {identifier: 249, text: "7 CLI Presentation"}]}}, {command: "d081fc8103012500820281828581ec5468652053494d207368616c6c20737570706c79206120736574206f66206d656e75206974656d732c207768696368207368616c6c20626520696e7465677261746564207769746820746865206d656e752073797374656d20286f72206f74686572204d4d4920666163696c6974792920696e206f7264657220746f206769766520746865207573657220746865206f70706f7274756e69747920746f2063686f6f7365206f6e65206f66207468657365206d656e75206974656d7320617420686973206f776e2064697363726574696f6e2e2045616368206974656d20636f6d70726973657320612073688f020159", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_5", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "The SIM shall supply a set of menu items, which shall be integrated with the menu system (or other MMI facility) in order to give the user the opportunity to choose one of these menu items at his own discretion. Each item comprises a sh", items: [{identifier: 1, text: "Y"}]}}, {command: "d03b810301258082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20338f07044974656d2034", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_6", - commandQualifier: 0x80, + expect: {commandQualifier: 0x80, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}]}}, {command: "d041810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20338f07044974656d2034180413101526", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_7", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}], - nextActionList: [iccManager.STK_CMD_SEND_SMS, iccManager.STK_CMD_SET_UP_CALL, iccManager.STK_CMD_LAUNCH_BROWSER, iccManager.STK_CMD_PROVIDE_LOCAL_INFO]}}, + nextActionList: [MozIccManager.STK_CMD_SEND_SMS, MozIccManager.STK_CMD_SET_UP_CALL, MozIccManager.STK_CMD_LAUNCH_BROWSER, MozIccManager.STK_CMD_PROVIDE_LOCAL_INFO]}}, {command: "d03c810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20339e0201019f0401030303", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_8", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", iconSelfExplanatory: false, - icons: [basicIcon], - items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: false, icons: [colorIcon]}, - {identifier: 2, text: "Item 2", iconSelfExplanatory: false, icons: [colorIcon]}, - {identifier: 3, text: "Item 3", iconSelfExplanatory: false, icons: [colorIcon]}]}}, + icons: [BASIC_ICON], + items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: false, icons: [COLOR_ICON]}, + {identifier: 2, text: "Item 2", iconSelfExplanatory: false, icons: [COLOR_ICON]}, + {identifier: 3, text: "Item 3", iconSelfExplanatory: false, icons: [COLOR_ICON]}]}}, {command: "d03c810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20339e0200019f0400050505", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_9", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", iconSelfExplanatory: true, - icons: [basicIcon], - items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}, - {identifier: 2, text: "Item 2", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}, - {identifier: 3, text: "Item 3", iconSelfExplanatory: true, icons: [colorTransparencyIcon]}]}}, + icons: [BASIC_ICON], + items: [{identifier: 1, text: "Item 1", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}, + {identifier: 2, text: "Item 2", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}, + {identifier: 3, text: "Item 3", iconSelfExplanatory: true, icons: [COLOR_TRANSPARENCY_ICON]}]}}, {command: "d029810301250182028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d2032", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_10", - commandQualifier: 0x01, + expect: {commandQualifier: 0x01, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e00b4d10c000600b4000600b4000600b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_11", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d034810301250082028182850e546f6f6c6b6974204d656e7520328f07044974656d20348f07054974656d20358f07064974656d2036", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_12", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 2", items: [{identifier: 4, text: "Item 4"}, {identifier: 5, text: "Item 5"}, {identifier: 6, text: "Item 6"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e01b4d10c000601b4000601b4000601b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_13", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d034810301250082028182850e546f6f6c6b6974204d656e7520328f07044974656d20348f07054974656d20358f07064974656d2036", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_14", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 2", items: [{identifier: 4, text: "Item 4"}, {identifier: 5, text: "Item 5"}, {identifier: 6, text: "Item 6"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e02b4d10c000602b4000602b4000602b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_15", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d034810301250082028182850e546f6f6c6b6974204d656e7520328f07044974656d20348f07054974656d20358f07064974656d2036", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_16", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 2", items: [{identifier: 4, text: "Item 4"}, {identifier: 5, text: "Item 5"}, {identifier: 6, text: "Item 6"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e04b4d10c000604b4000604b4000604b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_17", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520328f07044974656d20348f07054974656d20358f07064974656d2036d004000e00b4d10c000600b4000600b4000600b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_18", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 2", items: [{identifier: 4, text: "Item 4"}, {identifier: 5, text: "Item 5"}, {identifier: 6, text: "Item 6"}]}}, {command: "d034810301250082028182850e546f6f6c6b6974204d656e7520338f07074974656d20378f07084974656d20388f07094974656d2039", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_19", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 3", items: [{identifier: 7, text: "Item 7"}, {identifier: 8, text: "Item 8"}, {identifier: 9, text: "Item 9"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e08b4d10c000608b4000608b4000608b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_20", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e10b4d10c000610b4000610b4000610b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_21", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e20b4d10c000620b4000620b4000620b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_22", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e40b4d10c000640b4000640b4000640b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_23", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d048810301250082028182850e546f6f6c6b6974204d656e7520318f07014974656d20318f07024974656d20328f07034974656d2033d004000e80b4d10c000680b4000680b4000680b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_24", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu 1", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d046810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d2033d004000c00b4d10c000600b4000600b4000600b4", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_25", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}]}}, {command: "d0819c8103012500820281828519800417041404200410041204210422041204230419042204158f1c018004170414042004100412042104220412042304190422041500318f1c028004170414042004100412042104220412042304190422041500328f1c038004170414042004100412042104220412042304190422041500338f1c04800417041404200410041204210422041204230419042204150034", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_26", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "ЗДРАВСТВУЙТЕ", items: [{identifier: 1, text: "ЗДРАВСТВУЙТЕ1"}, {identifier: 2, text: "ЗДРАВСТВУЙТЕ2"}, {identifier: 3, text: "ЗДРАВСТВУЙТЕ3"}, {identifier: 4, text: "ЗДРАВСТВУЙТЕ4"}]}}, {command: "d0608103012500820281828519800417041404200410041204210422041204230419042204158f1c118004170414042004100412042104220412042304190422041500358f1c12800417041404200410041204210422041204230419042204150036", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_27", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "ЗДРАВСТВУЙТЕ", items: [{identifier: 17, text: "ЗДРАВСТВУЙТЕ5"}, {identifier: 18, text: "ЗДРАВСТВУЙТЕ6"}]}}, {command: "d03c8103012500820281828509805de551777bb153558f080180987976ee4e008f080280987976ee4e8c8f080380987976ee4e098f080480987976ee56db", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_28", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "工具箱单", items: [{identifier: 1, text: "项目一"}, {identifier: 2, text: "项目二"}, {identifier: 3, text: "项目三"}, {identifier: 4, text: "项目四"}]}}, {command: "d0208103012500820281828509805de551777bb153558f0411804e008f0412804e8c", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_29", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "工具箱单", items: [{identifier: 17, text: "一"}, {identifier: 18, text: "二"}]}}, {command: "d0448103012500820281828509800038003030eb00308f0a01800038003030eb00318f0a02800038003030eb00328f0a03800038003030eb00338f0a04800038003030eb0034", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_30", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "80ル0", items: [{identifier: 1, text: "80ル1"}, {identifier: 2, text: "80ル2"}, {identifier: 3, text: "80ル3"}, {identifier: 4, text: "80ル4"}]}}, {command: "d02c8103012500820281828509800038003030eb00308f0a11800038003030eb00358f0a12800038003030eb0036", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_31", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "80ル0", items: [{identifier: 17, text: "80ル5"}, {identifier: 18, text: "80ル6"}]}}, {command: "d041810301250082028182850c546f6f6c6b6974204d656e758f07014974656d20318f07024974656d20328f07034974656d20338f07044974656d2034180481000000", - func: testSetupMenu, - expect: {name: "setup_menu_cmd_32", - commandQualifier: 0x00, + expect: {commandQualifier: 0x00, title: "Toolkit Menu", items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}], - nextActionList: [iccManager.STK_NEXT_ACTION_END_PROACTIVE_SESSION, iccManager.STK_NEXT_ACTION_NULL, iccManager.STK_NEXT_ACTION_NULL, iccManager.STK_NEXT_ACTION_NULL]}}, - {command: "D00D81030125008202818285008F00", - func: testRemoveSetupMenu}, + nextActionList: [MozIccManager.STK_NEXT_ACTION_END_PROACTIVE_SESSION, MozIccManager.STK_NEXT_ACTION_NULL, MozIccManager.STK_NEXT_ACTION_NULL, MozIccManager.STK_NEXT_ACTION_NULL]}}, {command:"D03B810301250082028182850C546F6F6C6B6974204D656E758F07014974656D20318F07024974656D20328F07034974656D20338F07044974656D2034", - func: testInitialSetupMenu}, - + expect: {commandQualifier: 0x00, + title: "Toolkit Menu", + items: [{identifier: 1, text: "Item 1"}, {identifier: 2, text: "Item 2"}, {identifier: 3, text: "Item 3"}, {identifier: 4, text: "Item 4"}]}}, + // Test remove setup menu. + {command: "D00D81030125008202818285008F00", + expect: {commandQualifier: 0x00, + title: "", + items: [null]}}, ]; -runNextTest(); +function testSetupMenu(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_SET_UP_MENU, "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.title, aExpect.title, "options.title"); + + for (let index in aExpect.items) { + let item = aCommand.options.items[index]; + let itemExpect = aExpect.items[index]; + + if (!itemExpect) { + is(item, itemExpect, "options.items[" + index + "]"); + } else { + is(item.identifier, itemExpect.identifier, + "options.items[" + index + "].identifier"); + is(item.text, itemExpect.text, + "options.items[" + index + "].text"); + + if (itemExpect.icons) { + isIcons(item.icons, itemExpect.icons); + is(item.iconSelfExplanatory, itemExpect.iconSelfExplanatory, + "options.items[" + index + "].iconSelfExplanatory"); + } + } + } + + if (aExpect.icons) { + isIcons(aCommand.options.icons, aExpect.icons); + is(aCommand.options.iconSelfExplanatory, aExpect.iconSelfExplanatory, + "options.iconSelfExplanatory"); + } + + if (aExpect.nextActionList) { + for (let index in aExpect.nextActionList) { + is(aCommand.options.nextActionList[index], aExpect.nextActionList[index], + "options.nextActionList[" + index + "]"); + } + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("setup_menu_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testSetupMenu(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/icc/tests/marionette/test_stk_timer_management.js b/dom/icc/tests/marionette/test_stk_timer_management.js new file mode 100644 index 000000000000..d9a76778d0ed --- /dev/null +++ b/dom/icc/tests/marionette/test_stk_timer_management.js @@ -0,0 +1,61 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = "head.js"; + +const TEST_DATA = [ + // Start + {command: "d011810301270082028182a40101a503102030", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_TIMER_START, + timerAction: MozIccManager.STK_TIMER_START, + timerId: 0x01, + timerValue: (0x01 * 60 * 60) + (0x02 * 60) + 0x03}}, + // Deactivate + {command: "d00c810301270182028182a40104", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_TIMER_DEACTIVATE, + timerAction: MozIccManager.STK_TIMER_DEACTIVATE, + timerId: 0x04}}, + // Get current value + {command: "d00c810301270282028182a40108", + expect: {commandNumber: 0x01, + commandQualifier: MozIccManager.STK_TIMER_GET_CURRENT_VALUE, + timerAction: MozIccManager.STK_TIMER_GET_CURRENT_VALUE, + timerId: 0x08}}, +]; + +function testTimerManagement(aCommand, aExpect) { + is(aCommand.typeOfCommand, MozIccManager.STK_CMD_TIMER_MANAGEMENT, + "typeOfCommand"); + is(aCommand.commandQualifier, aExpect.commandQualifier, "commandQualifier"); + is(aCommand.options.timerAction, aExpect.timerAction, "options.timerAction"); + is(aCommand.options.timerId, aExpect.timerId, "options.timerId"); + + if (aExpect.timerValue) { + is(aCommand.options.timerValue, aExpect.timerValue, "options.timerValue"); + } +} + +// Start tests +startTestCommon(function() { + let icc = getMozIcc(); + let promise = Promise.resolve(); + for (let i = 0; i < TEST_DATA.length; i++) { + let data = TEST_DATA[i]; + promise = promise.then(() => { + log("timer_management_cmd: " + data.command); + + let promises = []; + // Wait onstkcommand event. + promises.push(waitForTargetEvent(icc, "stkcommand") + .then((aEvent) => testTimerManagement(aEvent.command, data.expect))); + // Send emulator command to generate stk unsolicited event. + promises.push(sendEmulatorStkPdu(data.command)); + + return Promise.all(promises); + }); + } + return promise; +}); diff --git a/dom/media/gmp/GMPLoader.cpp b/dom/media/gmp/GMPLoader.cpp index 956073646441..884ce73c6e5d 100644 --- a/dom/media/gmp/GMPLoader.cpp +++ b/dom/media/gmp/GMPLoader.cpp @@ -14,6 +14,7 @@ #if defined(XP_WIN) && defined(MOZ_SANDBOX) #include "mozilla/sandboxTarget.h" +#include "mozilla/Scoped.h" #include "windows.h" #include #include @@ -33,6 +34,31 @@ #include "sha256.h" #endif +#if defined(XP_WIN) && defined(MOZ_SANDBOX) +namespace { + +// Scoped type used by Load +struct ScopedActCtxHandleTraits +{ + typedef HANDLE type; + + static type empty() + { + return INVALID_HANDLE_VALUE; + } + + static void release(type aActCtxHandle) + { + if (aActCtxHandle != INVALID_HANDLE_VALUE) { + ReleaseActCtx(aActCtxHandle); + } + } +}; +typedef mozilla::Scoped ScopedActCtxHandle; + +} // anonymous namespace +#endif + namespace mozilla { namespace gmp { @@ -168,6 +194,30 @@ GMPLoaderImpl::Load(const char* aLibPath, nodeId = std::string(aOriginSalt, aOriginSalt + aOriginSaltLen); } +#if defined(XP_WIN) && defined(MOZ_SANDBOX) + // If the GMP DLL is a side-by-side assembly with static imports then the DLL + // loader will attempt to create an activation context which will fail because + // of the sandbox. If we create an activation context before we start the + // sandbox then this one will get picked up by the DLL loader. + int pathLen = MultiByteToWideChar(CP_ACP, 0, aLibPath, -1, nullptr, 0); + if (pathLen == 0) { + return false; + } + + wchar_t* widePath = new wchar_t[pathLen]; + if (MultiByteToWideChar(CP_ACP, 0, aLibPath, -1, widePath, pathLen) == 0) { + delete[] widePath; + return false; + } + + ACTCTX actCtx = { sizeof(actCtx) }; + actCtx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; + actCtx.lpSource = widePath; + actCtx.lpResourceName = ISOLATIONAWARE_MANIFEST_RESOURCE_ID; + ScopedActCtxHandle actCtxHandle(CreateActCtx(&actCtx)); + delete[] widePath; +#endif + // Start the sandbox now that we've generated the device bound node id. // This must happen after the node id is bound to the device id, as // generating the device id requires privileges. diff --git a/dom/media/mediasource/SourceBuffer.cpp b/dom/media/mediasource/SourceBuffer.cpp index 0db218582499..bc08ccdd8c7f 100644 --- a/dom/media/mediasource/SourceBuffer.cpp +++ b/dom/media/mediasource/SourceBuffer.cpp @@ -19,6 +19,7 @@ #include "nsIRunnable.h" #include "nsThreadUtils.h" #include "prlog.h" +#include struct JSContext; class JSObject; @@ -36,14 +37,37 @@ extern PRLogModuleInfo* GetMediaSourceAPILog(); #define MSE_API(...) #endif -// RangeRemoval must be synchronous if appendBuffer is also synchronous. -// While waiting for bug 1118589 to land, ensure RangeRemoval is synchronous -#define APPENDBUFFER_IS_SYNCHRONOUS - namespace mozilla { namespace dom { +class AppendDataRunnable : public nsRunnable { +public: + AppendDataRunnable(SourceBuffer* aSourceBuffer, + const uint8_t* aData, + uint32_t aLength, + double aTimestampOffset) + : mSourceBuffer(aSourceBuffer) + , mTimestampOffset(aTimestampOffset) + { + mData.AppendElements(aData, aLength); + } + + NS_IMETHOD Run() MOZ_OVERRIDE MOZ_FINAL { + + mSourceBuffer->AppendData(mData.Elements(), + mData.Length(), + mTimestampOffset); + + return NS_OK; + } + +private: + nsRefPtr mSourceBuffer; + nsTArray mData; + double mTimestampOffset; +}; + class RangeRemovalRunnable : public nsRunnable { public: RangeRemovalRunnable(SourceBuffer* aSourceBuffer, @@ -240,18 +264,8 @@ SourceBuffer::RangeRemoval(double aStart, double aEnd) { StartUpdating(); -#if defined(APPENDBUFFER_IS_SYNCHRONOUS) - DoRangeRemoval(aStart, aEnd); - - // Run the final step of the buffer append algorithm asynchronously to - // ensure the SourceBuffer's updating flag transition behaves as required - // by the spec. - nsCOMPtr event = NS_NewRunnableMethod(this, &SourceBuffer::StopUpdating); - NS_DispatchToMainThread(event); -#else nsRefPtr task = new RangeRemovalRunnable(this, aStart, aEnd); NS_DispatchToMainThread(task); -#endif } void @@ -267,9 +281,7 @@ SourceBuffer::DoRangeRemoval(double aStart, double aEnd) mTrackBuffer->RangeRemoval(start, end); } -#if !defined(APPENDBUFFER_IS_SYNCHRONOUS) StopUpdating(); -#endif } void @@ -405,10 +417,29 @@ SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aR MOZ_ASSERT(mAppendMode == SourceBufferAppendMode::Segments, "We don't handle timestampOffset for sequence mode yet"); + nsRefPtr task = + new AppendDataRunnable(this, aData, aLength, mTimestampOffset); + NS_DispatchToMainThread(task); +} + +void +SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, double aTimestampOffset) +{ + if (!mUpdating) { + // The buffer append algorithm has been interrupted by abort(). + // + // If the sequence appendBuffer(), abort(), appendBuffer() occurs before + // the first StopUpdating() runnable runs, then a second StopUpdating() + // runnable will be scheduled, but still only one (the first) will queue + // events. + return; + } + + MOZ_ASSERT(mMediaSource); + if (aLength) { - if (!mTrackBuffer->AppendData(aData, aLength, mTimestampOffset * USECS_PER_S)) { - nsCOMPtr event = NS_NewRunnableMethodWithArg(this, &SourceBuffer::AppendError, true); - NS_DispatchToMainThread(event); + if (!mTrackBuffer->AppendData(aData, aLength, aTimestampOffset * USECS_PER_S)) { + AppendError(true); return; } @@ -419,12 +450,8 @@ SourceBuffer::AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aR CheckEndTime(); } - // Run the final step of the buffer append algorithm asynchronously to - // ensure the SourceBuffer's updating flag transition behaves as required - // by the spec. - nsCOMPtr event = NS_NewRunnableMethod(this, &SourceBuffer::StopUpdating); - NS_DispatchToMainThread(event); -} + StopUpdating(); + } void SourceBuffer::AppendError(bool aDecoderError) diff --git a/dom/media/mediasource/SourceBuffer.h b/dom/media/mediasource/SourceBuffer.h index 413a156f6f53..280364fd0f48 100644 --- a/dom/media/mediasource/SourceBuffer.h +++ b/dom/media/mediasource/SourceBuffer.h @@ -122,6 +122,7 @@ private: ~SourceBuffer(); friend class AsyncEventRunner; + friend class AppendDataRunnable; void DispatchSimpleEvent(const char* aName); void QueueAsyncSimpleEvent(const char* aName); @@ -137,6 +138,8 @@ private: // Shared implementation of AppendBuffer overloads. void AppendData(const uint8_t* aData, uint32_t aLength, ErrorResult& aRv); + void AppendData(const uint8_t* aData, uint32_t aLength, + double aTimestampOffset); // Implement the "Append Error Algorithm". // Will call endOfStream() with "decode" error if aDecodeError is true. diff --git a/dom/media/mediasource/SourceBufferDecoder.cpp b/dom/media/mediasource/SourceBufferDecoder.cpp index 3071ce3c444a..8e409fe366d4 100644 --- a/dom/media/mediasource/SourceBufferDecoder.cpp +++ b/dom/media/mediasource/SourceBufferDecoder.cpp @@ -8,6 +8,7 @@ #include "prlog.h" #include "AbstractMediaDecoder.h" #include "MediaDecoderReader.h" +#include "mozilla/dom/TimeRanges.h" #ifdef PR_LOGGING extern PRLogModuleInfo* GetMediaSourceLog(); diff --git a/dom/system/gonk/NetworkManager.js b/dom/system/gonk/NetworkManager.js index c26d162ce33b..81502c512efc 100644 --- a/dom/system/gonk/NetworkManager.js +++ b/dom/system/gonk/NetworkManager.js @@ -304,6 +304,11 @@ NetworkManager.prototype = { } this.networkInterfaces[networkId] = network; + if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { + debug("Force setting " + SETTINGS_DUN_REQUIRED + " to true."); + this.tetheringSettings[SETTINGS_DUN_REQUIRED] = true; + } + Services.obs.notifyObservers(network, TOPIC_INTERFACE_REGISTERED, null); debug("Network '" + networkId + "' registered."); }, @@ -428,6 +433,11 @@ NetworkManager.prototype = { } delete this.networkInterfaces[networkId]; + if (network.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) { + this.tetheringSettings[SETTINGS_DUN_REQUIRED] = + libcutils.property_get("ro.tethering.dun_required") === "1"; + } + Services.obs.notifyObservers(network, TOPIC_INTERFACE_UNREGISTERED, null); debug("Network '" + networkId + "' unregistered."); }, diff --git a/dom/tethering/tests/marionette/head.js b/dom/tethering/tests/marionette/head.js index bd2731b64ec0..0b08dc57108f 100644 --- a/dom/tethering/tests/marionette/head.js +++ b/dom/tethering/tests/marionette/head.js @@ -16,6 +16,8 @@ const TETHERING_SETTING_END_IP = "192.168.1.30"; const TETHERING_SETTING_DNS1 = "8.8.8.8"; const TETHERING_SETTING_DNS2 = "8.8.4.4"; +const TETHERING_NETWORK_ADDR = "192.168.1.0/24"; + /** * Wifi tethering setting. */ @@ -24,6 +26,7 @@ const TETHERING_SETTING_SECURITY = "open"; const TETHERING_SETTING_KEY = "1234567890"; const SETTINGS_RIL_DATA_ENABLED = 'ril.data.enabled'; +const SETTINGS_KEY_DATA_APN_SETTINGS = "ril.data.apnSettings"; // Emulate Promise.jsm semantics. Promise.defer = function() { return new Deferred(); } @@ -201,6 +204,20 @@ let gTestSuite = (function() { return setSettings(settings, aAllowError); } + /** + * Convenient MozSettings getter for SETTINGS_KEY_DATA_APN_SETTINGS. + */ + function getDataApnSettings(aAllowError) { + return getSettings(SETTINGS_KEY_DATA_APN_SETTINGS, aAllowError); + } + + /** + * Convenient MozSettings setter for SETTINGS_KEY_DATA_APN_SETTINGS. + */ + function setDataApnSettings(aApnSettings, aAllowError) { + return setSettings1(SETTINGS_KEY_DATA_APN_SETTINGS, aApnSettings, aAllowError); + } + /** * Wrap DOMRequest onsuccess/onerror events to Promise resolve/reject. * @@ -297,6 +314,9 @@ let gTestSuite = (function() { * We also verify iptables output as netd's NatController will execute * $ iptables -t nat -A POSTROUTING -o rmnet0 -j MASQUERADE * + * For tethering through dun, we use 'ip rule' to find the secondary routing + * table and look for default route on that table. + * * Resolve when the verification is successful and reject otherwise. * * Fulfill params: (none) @@ -304,9 +324,10 @@ let gTestSuite = (function() { * * @return A deferred promise. */ - function verifyTetheringRouting(aEnabled) { + function verifyTetheringRouting(aEnabled, aIsDun) { let netcfgResult = {}; let ipRouteResult = {}; + let ipSecondaryRouteResult = {}; // Execute 'netcfg' and parse to |netcfgResult|, each key of which is the // interface name and value is { ip(string) }. @@ -418,8 +439,76 @@ let gTestSuite = (function() { }); } + // Execute 'ip rule show', there must be one rule for tethering network + // address to lookup for a secondary routing table, return that table id. + function verifyIpRule() { + if (!aIsDun) { + return; + } + + return runEmulatorShellSafe(['ip', 'rule', 'show']) + .then(function (aLines) { + // Sample output: + // + // 0: from all lookup local + // 32765: from 192.168.1.0/24 lookup 60 + // 32766: from all lookup main + // 32767: from all lookup default + // + let tableId = (function findTableId() { + for (let i = 0; i < aLines.length; i++) { + let tokens = aLines[i].split(/\s+/); + if (-1 != tokens.indexOf(TETHERING_NETWORK_ADDR)) { + let lookupIndex = tokens.indexOf('lookup'); + if (lookupIndex < 0 || lookupIndex + 1 >= tokens.length) { + return; + } + return tokens[lookupIndex + 1]; + } + } + return; + })(); + + if ((aEnabled && !tableId) || (!aEnabled && tableId)) { + throw 'Secondary table' + (tableId ? '' : ' not') + ' found while tethering is ' + + (aEnabled ? 'enabled' : 'disabled'); + } + + return tableId; + }); + } + + // Given the table id, use 'ip rule show table ' to find the + // default route on that secondary routing table. + function execAndParseSecondaryTable(aTableId) { + if (!aIsDun || !aEnabled) { + return; + } + + return runEmulatorShellSafe(['ip', 'route', 'show', 'table', aTableId]) + .then(function (aLines) { + // We only look for default route in secondary table. + aLines.forEach(function (aLine) { + let tokens = aLine.split(/\s+/); + if (tokens.length < 2) { + return; + } + if ('default' === tokens[0]) { + let ifnameIndex = tokens.indexOf('dev'); + if (ifnameIndex < 0 || ifnameIndex + 1 >= tokens.length) { + return; + } + let ifname = tokens[ifnameIndex + 1]; + ipSecondaryRouteResult[ifname] = { default: true }; + return; + } + }); + }); + } + function verifyDefaultRouteAndIp(aExpectedWifiTetheringIp) { log(JSON.stringify(ipRouteResult)); + log(JSON.stringify(ipSecondaryRouteResult)); log(JSON.stringify(netcfgResult)); if (aEnabled) { @@ -429,10 +518,19 @@ let gTestSuite = (function() { isOrThrow(ipRouteResult['wlan0'].src, netcfgResult['wlan0'].ip, 'wlan0.ip'); isOrThrow(ipRouteResult['wlan0'].src, aExpectedWifiTetheringIp, 'expected ip'); isOrThrow(ipRouteResult['wlan0'].default, false, 'wlan0.default'); + + if (aIsDun) { + isOrThrow(ipRouteResult['rmnet1'].src, netcfgResult['rmnet1'].ip, 'rmnet1.ip'); + isOrThrow(ipRouteResult['rmnet1'].default, false, 'rmnet1.default'); + // Dun's network default route is set on secondary routing table. + isOrThrow(ipSecondaryRouteResult['rmnet1'].default, true, 'secondary rmnet1.default'); + } } } return verifyIptables() + .then(verifyIpRule) + .then(tableId => execAndParseSecondaryTable(tableId)) .then(exeAndParseNetcfg) .then(exeAndParseIpRoute) .then(() => verifyDefaultRouteAndIp(TETHERING_SETTING_IP)); @@ -450,10 +548,12 @@ let gTestSuite = (function() { * * @param aEnabled * Boolean that indicates to enable or disable wifi tethering. + * @param aIsDun + * Boolean that indicates whether dun is required. * * @return A deferred promise. */ - function setWifiTetheringEnabled(aEnabled) { + function setWifiTetheringEnabled(aEnabled, aIsDun) { let RETRY_INTERVAL_MS = 1000; let retryCnt = 20; @@ -472,7 +572,7 @@ let gTestSuite = (function() { return tetheringManager.setTetheringEnabled(aEnabled, TYPE_WIFI, config) .then(function waitForRoutingVerified() { - return verifyTetheringRouting(aEnabled) + return verifyTetheringRouting(aEnabled, aIsDun) .then(null, function onreject(aReason) { log('verifyTetheringRouting rejected due to ' + aReason + @@ -602,6 +702,9 @@ let gTestSuite = (function() { //--------------------------------------------------- suite.ensureWifiEnabled = ensureWifiEnabled; suite.setWifiTetheringEnabled = setWifiTetheringEnabled; + suite.getDataApnSettings = getDataApnSettings; + suite.setDataApnSettings = setDataApnSettings; + /** * The common test routine for wifi tethering. diff --git a/dom/tethering/tests/marionette/manifest.ini b/dom/tethering/tests/marionette/manifest.ini index 3958e62839c7..9cd43c60da7a 100644 --- a/dom/tethering/tests/marionette/manifest.ini +++ b/dom/tethering/tests/marionette/manifest.ini @@ -4,3 +4,4 @@ browser = false qemu = true [test_wifi_tethering_enabled.js] +[test_wifi_tethering_dun.js] diff --git a/dom/tethering/tests/marionette/test_wifi_tethering_dun.js b/dom/tethering/tests/marionette/test_wifi_tethering_dun.js new file mode 100644 index 000000000000..e4e11c7cecd5 --- /dev/null +++ b/dom/tethering/tests/marionette/test_wifi_tethering_dun.js @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +MARIONETTE_TIMEOUT = 60000; +MARIONETTE_HEAD_JS = 'head.js'; + +gTestSuite.startTest(function() { + let origApnSettings; + return gTestSuite.getDataApnSettings() + .then(value => { + origApnSettings = value; + }) + .then(() => { + // Set dun apn settings. + let apnSettings = [[ { "carrier": "T-Mobile US", + "apn": "epc1.tmobile.com", + "mmsc": "http://mms.msg.eng.t-mobile.com/mms/wapenc", + "types": ["default","supl","mms"] }, + { "carrier": "T-Mobile US", + "apn": "epc2.tmobile.com", + "types": ["dun"] } ]]; + return gTestSuite.setDataApnSettings(apnSettings); + }) + .then(() => gTestSuite.startTetheringTest(function() { + return gTestSuite.ensureWifiEnabled(false) + .then(() => gTestSuite.setWifiTetheringEnabled(true, true)) + .then(() => gTestSuite.setWifiTetheringEnabled(false, true)); + })) + // Restore apn settings. + .then(() => { + if (origApnSettings) { + return gTestSuite.setDataApnSettings(origApnSettings); + } + }); +}); \ No newline at end of file diff --git a/dom/tethering/tests/marionette/test_wifi_tethering_enabled.js b/dom/tethering/tests/marionette/test_wifi_tethering_enabled.js index e681628377b1..936219ec5fc3 100644 --- a/dom/tethering/tests/marionette/test_wifi_tethering_enabled.js +++ b/dom/tethering/tests/marionette/test_wifi_tethering_enabled.js @@ -7,5 +7,6 @@ MARIONETTE_HEAD_JS = 'head.js'; gTestSuite.startTetheringTest(function() { return gTestSuite.ensureWifiEnabled(false) - .then(() => gTestSuite.setWifiTetheringEnabled(true)); + .then(() => gTestSuite.setWifiTetheringEnabled(true)) + .then(() => gTestSuite.setWifiTetheringEnabled(false)); }); diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl index 5dea5cf6c1c0..fa4c6656c0c5 100644 --- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl @@ -405,16 +405,16 @@ partial interface Window { [Func="IsChromeOrXBL"] interface ChromeWindow { - [Func="nsGlobalWindow::IsChromeWindow"] + [Func="nsGlobalWindow::IsPrivilegedChromeWindow"] const unsigned short STATE_MAXIMIZED = 1; - [Func="nsGlobalWindow::IsChromeWindow"] + [Func="nsGlobalWindow::IsPrivilegedChromeWindow"] const unsigned short STATE_MINIMIZED = 2; - [Func="nsGlobalWindow::IsChromeWindow"] + [Func="nsGlobalWindow::IsPrivilegedChromeWindow"] const unsigned short STATE_NORMAL = 3; - [Func="nsGlobalWindow::IsChromeWindow"] + [Func="nsGlobalWindow::IsPrivilegedChromeWindow"] const unsigned short STATE_FULLSCREEN = 4; - [Func="nsGlobalWindow::IsChromeWindow"] + [Func="nsGlobalWindow::IsPrivilegedChromeWindow"] readonly attribute unsigned short windowState; /** @@ -422,40 +422,40 @@ interface ChromeWindow { * utility functions implemented by chrome script. It will be null * for DOMWindows not corresponding to browsers. */ - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] attribute nsIBrowserDOMWindow? browserDOMWindow; - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] void getAttention(); - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] void getAttentionWithCycleCount(long aCycleCount); - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] void setCursor(DOMString cursor); - [Throws, Func="nsGlobalWindow::IsChromeWindow", UnsafeInPrerendering] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow", UnsafeInPrerendering] void maximize(); - [Throws, Func="nsGlobalWindow::IsChromeWindow", UnsafeInPrerendering] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow", UnsafeInPrerendering] void minimize(); - [Throws, Func="nsGlobalWindow::IsChromeWindow", UnsafeInPrerendering] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow", UnsafeInPrerendering] void restore(); /** * Notify a default button is loaded on a dialog or a wizard. * defaultButton is the default button. */ - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] void notifyDefaultButtonLoaded(Element defaultButton); - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] readonly attribute nsIMessageBroadcaster messageManager; /** * Returns the message manager identified by the given group name that * manages all frame loaders belonging to that group. */ - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] nsIMessageBroadcaster getGroupMessageManager(DOMString aGroup); /** @@ -468,7 +468,7 @@ interface ChromeWindow { * * Throws NS_ERROR_NOT_IMPLEMENTED if the OS doesn't support this. */ - [Throws, Func="nsGlobalWindow::IsChromeWindow"] + [Throws, Func="nsGlobalWindow::IsPrivilegedChromeWindow"] void beginWindowMove(Event mouseDownEvent, optional Element? panel = null); }; diff --git a/dom/workers/ServiceWorkerRegistration.h b/dom/workers/ServiceWorkerRegistration.h index 39fcbc26c529..1fcd2d619dcb 100644 --- a/dom/workers/ServiceWorkerRegistration.h +++ b/dom/workers/ServiceWorkerRegistration.h @@ -8,6 +8,7 @@ #define mozilla_dom_ServiceWorkerRegistration_h #include "mozilla/DOMEventTargetHelper.h" +#include "mozilla/dom/ServiceWorkerBinding.h" #include "mozilla/dom/ServiceWorkerCommon.h" class nsPIDOMWindow; diff --git a/dom/xbl/nsXBLService.cpp b/dom/xbl/nsXBLService.cpp index fbe03eb244a9..a05f090ce19d 100644 --- a/dom/xbl/nsXBLService.cpp +++ b/dom/xbl/nsXBLService.cpp @@ -1100,8 +1100,7 @@ nsXBLService::FetchBindingDocument(nsIContent* aBoundElement, nsIDocument* aBoun NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr sameOriginChecker = nsContentUtils::GetSameOriginChecker(); - NS_ENSURE_TRUE(sameOriginChecker, NS_ERROR_OUT_OF_MEMORY); + nsCOMPtr sameOriginChecker = nsContentUtils::SameOriginChecker(); channel->SetNotificationCallbacks(sameOriginChecker); diff --git a/dom/xml/XMLDocument.cpp b/dom/xml/XMLDocument.cpp index eb916aa175db..7a05858386d3 100644 --- a/dom/xml/XMLDocument.cpp +++ b/dom/xml/XMLDocument.cpp @@ -434,11 +434,7 @@ XMLDocument::Load(const nsAString& aUrl, ErrorResult& aRv) mListenerManager = elm; // Create a channel - nsCOMPtr req = nsContentUtils::GetSameOriginChecker(); - if (!req) { - aRv.Throw(NS_ERROR_OUT_OF_MEMORY); - return false; - } + nsCOMPtr req = nsContentUtils::SameOriginChecker(); nsCOMPtr channel; // nsIRequest::LOAD_BACKGROUND prevents throbber from becoming active, diff --git a/image/src/Decoder.h b/image/src/Decoder.h index b0d5ba2e896f..afd7c2805572 100644 --- a/image/src/Decoder.h +++ b/image/src/Decoder.h @@ -108,7 +108,7 @@ public: } // We're not COM-y, so we don't get refcounts by default - NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Decoder) + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(Decoder, MOZ_OVERRIDE) // Implement IResumable. virtual void Resume() MOZ_OVERRIDE; diff --git a/js/src/asmjs/AsmJSModule.cpp b/js/src/asmjs/AsmJSModule.cpp index a8cbfdc59bef..e146b631ed66 100644 --- a/js/src/asmjs/AsmJSModule.cpp +++ b/js/src/asmjs/AsmJSModule.cpp @@ -453,7 +453,7 @@ AsmJSModule::setAutoFlushICacheRange() static void AsmJSReportOverRecursed() { - JSContext *cx = PerThreadData::innermostAsmJSActivation()->cx(); + JSContext *cx = JSRuntime::innermostAsmJSActivation()->cx(); js_ReportOverRecursed(cx); } @@ -461,14 +461,14 @@ static void OnDetached() { // See hasDetachedHeap comment in LinkAsmJS. - JSContext *cx = PerThreadData::innermostAsmJSActivation()->cx(); + JSContext *cx = JSRuntime::innermostAsmJSActivation()->cx(); JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_OUT_OF_MEMORY); } static bool AsmJSHandleExecutionInterrupt() { - AsmJSActivation *act = PerThreadData::innermostAsmJSActivation(); + AsmJSActivation *act = JSRuntime::innermostAsmJSActivation(); act->module().setInterrupted(true); bool ret = CheckForInterrupt(act->cx()); act->module().setInterrupted(false); @@ -478,7 +478,7 @@ AsmJSHandleExecutionInterrupt() static int32_t CoerceInPlace_ToInt32(MutableHandleValue val) { - JSContext *cx = PerThreadData::innermostAsmJSActivation()->cx(); + JSContext *cx = JSRuntime::innermostAsmJSActivation()->cx(); int32_t i32; if (!ToInt32(cx, val, &i32)) @@ -491,7 +491,7 @@ CoerceInPlace_ToInt32(MutableHandleValue val) static int32_t CoerceInPlace_ToNumber(MutableHandleValue val) { - JSContext *cx = PerThreadData::innermostAsmJSActivation()->cx(); + JSContext *cx = JSRuntime::innermostAsmJSActivation()->cx(); double dbl; if (!ToNumber(cx, val, &dbl)) @@ -570,7 +570,7 @@ InvokeFromAsmJS(AsmJSActivation *activation, int32_t exitIndex, int32_t argc, Va static int32_t InvokeFromAsmJS_Ignore(int32_t exitIndex, int32_t argc, Value *argv) { - AsmJSActivation *activation = PerThreadData::innermostAsmJSActivation(); + AsmJSActivation *activation = JSRuntime::innermostAsmJSActivation(); JSContext *cx = activation->cx(); RootedValue rval(cx); @@ -582,7 +582,7 @@ InvokeFromAsmJS_Ignore(int32_t exitIndex, int32_t argc, Value *argv) static int32_t InvokeFromAsmJS_ToInt32(int32_t exitIndex, int32_t argc, Value *argv) { - AsmJSActivation *activation = PerThreadData::innermostAsmJSActivation(); + AsmJSActivation *activation = JSRuntime::innermostAsmJSActivation(); JSContext *cx = activation->cx(); RootedValue rval(cx); @@ -602,7 +602,7 @@ InvokeFromAsmJS_ToInt32(int32_t exitIndex, int32_t argc, Value *argv) static int32_t InvokeFromAsmJS_ToNumber(int32_t exitIndex, int32_t argc, Value *argv) { - AsmJSActivation *activation = PerThreadData::innermostAsmJSActivation(); + AsmJSActivation *activation = JSRuntime::innermostAsmJSActivation(); JSContext *cx = activation->cx(); RootedValue rval(cx); diff --git a/js/src/asmjs/AsmJSSignalHandlers.cpp b/js/src/asmjs/AsmJSSignalHandlers.cpp index fd344a2ef18e..68ac55c66a5a 100644 --- a/js/src/asmjs/AsmJSSignalHandlers.cpp +++ b/js/src/asmjs/AsmJSSignalHandlers.cpp @@ -448,7 +448,7 @@ HandleFault(PEXCEPTION_POINTERS exception) return false; AutoSetHandlingSignal handling(rt); - AsmJSActivation *activation = rt->mainThread.asmJSActivationStack(); + AsmJSActivation *activation = rt->asmJSActivationStack(); if (!activation) return false; @@ -647,7 +647,7 @@ HandleMachException(JSRuntime *rt, const ExceptionRequest &request) if (request.body.exception != EXC_BAD_ACCESS || request.body.codeCnt != 2) return false; - AsmJSActivation *activation = rt->mainThread.asmJSActivationStack(); + AsmJSActivation *activation = rt->asmJSActivationStack(); if (!activation) return false; @@ -861,7 +861,7 @@ HandleFault(int signum, siginfo_t *info, void *ctx) return false; AutoSetHandlingSignal handling(rt); - AsmJSActivation *activation = rt->mainThread.asmJSActivationStack(); + AsmJSActivation *activation = rt->asmJSActivationStack(); if (!activation) return false; @@ -947,12 +947,12 @@ RedirectJitCodeToInterruptCheck(JSRuntime *rt, CONTEXT *context) { RedirectIonBackedgesToInterruptCheck(rt); - if (AsmJSActivation *activation = rt->mainThread.asmJSActivationStack()) { + if (AsmJSActivation *activation = rt->asmJSActivationStack()) { const AsmJSModule &module = activation->module(); #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - if (module.containsFunctionPC((void*)rt->mainThread.simulator()->get_pc())) - rt->mainThread.simulator()->set_resume_pc(int32_t(module.interruptExit())); + if (module.containsFunctionPC((void*)rt->simulator()->get_pc())) + rt->simulator()->set_resume_pc(int32_t(module.interruptExit())); #endif uint8_t **ppc = ContextToPC(context); diff --git a/js/src/asmjs/AsmJSValidate.cpp b/js/src/asmjs/AsmJSValidate.cpp index f61e89c68837..aba512306823 100644 --- a/js/src/asmjs/AsmJSValidate.cpp +++ b/js/src/asmjs/AsmJSValidate.cpp @@ -8504,25 +8504,21 @@ GenerateFFIIonExit(ModuleCompiler &m, const ModuleCompiler::ExitDescriptor &exit // The following is inlined: // JSContext *cx = activation->cx(); - // Activation *act = cx->mainThread().activation(); + // Activation *act = cx->runtime()->activation(); // act.active_ = true; - // act.prevJitTop_ = cx->mainThread().jitTop; - // act.prevJitJSContext_ = cx->mainThread().jitJSContext; - // cx->mainThread().jitJSContext = cx; - // act.prevJitActivation_ = cx->mainThread().jitActivation; - // cx->mainThread().jitActivation = act; - // act.prevProfilingActivation_ = cx->mainThread().profilingActivation; - // cx->mainThread().profilingActivation_ = act; + // act.prevJitTop_ = cx->runtime()->jitTop; + // act.prevJitJSContext_ = cx->runtime()->jitJSContext; + // cx->runtime()->jitJSContext = cx; + // act.prevJitActivation_ = cx->runtime()->jitActivation; + // cx->runtime()->jitActivation = act; + // act.prevProfilingActivation_ = cx->runtime()->profilingActivation; + // cx->runtime()->profilingActivation_ = act; // On the ARM store8() uses the secondScratchReg (lr) as a temp. - size_t offsetOfActivation = offsetof(JSRuntime, mainThread) + - PerThreadData::offsetOfActivation(); - size_t offsetOfJitTop = offsetof(JSRuntime, mainThread) + offsetof(PerThreadData, jitTop); - size_t offsetOfJitJSContext = offsetof(JSRuntime, mainThread) + - offsetof(PerThreadData, jitJSContext); - size_t offsetOfJitActivation = offsetof(JSRuntime, mainThread) + - offsetof(PerThreadData, jitActivation); - size_t offsetOfProfilingActivation = offsetof(JSRuntime, mainThread) + - PerThreadData::offsetOfProfilingActivation(); + size_t offsetOfActivation = JSRuntime::offsetOfActivation(); + size_t offsetOfJitTop = offsetof(JSRuntime, jitTop); + size_t offsetOfJitJSContext = offsetof(JSRuntime, jitJSContext); + size_t offsetOfJitActivation = offsetof(JSRuntime, jitActivation); + size_t offsetOfProfilingActivation = JSRuntime::offsetOfProfilingActivation(); masm.loadAsmJSActivation(reg0); masm.loadPtr(Address(reg0, AsmJSActivation::offsetOfContext()), reg3); masm.loadPtr(Address(reg3, JSContext::offsetOfRuntime()), reg0); @@ -8531,26 +8527,26 @@ GenerateFFIIonExit(ModuleCompiler &m, const ModuleCompiler::ExitDescriptor &exit // act.active_ = true; masm.store8(Imm32(1), Address(reg1, JitActivation::offsetOfActiveUint8())); - // act.prevJitTop_ = cx->mainThread().jitTop; + // act.prevJitTop_ = cx->runtime()->jitTop; masm.loadPtr(Address(reg0, offsetOfJitTop), reg2); masm.storePtr(reg2, Address(reg1, JitActivation::offsetOfPrevJitTop())); - // act.prevJitJSContext_ = cx->mainThread().jitJSContext; + // act.prevJitJSContext_ = cx->runtime()->jitJSContext; masm.loadPtr(Address(reg0, offsetOfJitJSContext), reg2); masm.storePtr(reg2, Address(reg1, JitActivation::offsetOfPrevJitJSContext())); - // cx->mainThread().jitJSContext = cx; + // cx->runtime()->jitJSContext = cx; masm.storePtr(reg3, Address(reg0, offsetOfJitJSContext)); - // act.prevJitActivation_ = cx->mainThread().jitActivation; + // act.prevJitActivation_ = cx->runtime()->jitActivation; masm.loadPtr(Address(reg0, offsetOfJitActivation), reg2); masm.storePtr(reg2, Address(reg1, JitActivation::offsetOfPrevJitActivation())); - // cx->mainThread().jitActivation = act; + // cx->runtime()->jitActivation = act; masm.storePtr(reg1, Address(reg0, offsetOfJitActivation)); - // act.prevProfilingActivation_ = cx->mainThread().profilingActivation; + // act.prevProfilingActivation_ = cx->runtime()->profilingActivation; masm.loadPtr(Address(reg0, offsetOfProfilingActivation), reg2); masm.storePtr(reg2, Address(reg1, Activation::offsetOfPrevProfiling())); - // cx->mainThread().profilingActivation_ = act; + // cx->runtime()->profilingActivation_ = act; masm.storePtr(reg1, Address(reg0, offsetOfProfilingActivation)); } @@ -8571,41 +8567,37 @@ GenerateFFIIonExit(ModuleCompiler &m, const ModuleCompiler::ExitDescriptor &exit Register reg2 = AsmJSIonExitRegD2; // The following is inlined: - // rt->mainThread.profilingActivation = prevProfilingActivation_; - // rt->mainThread.activation()->active_ = false; - // rt->mainThread.jitTop = prevJitTop_; - // rt->mainThread.jitJSContext = prevJitJSContext_; - // rt->mainThread.jitActivation = prevJitActivation_; + // rt->profilingActivation = prevProfilingActivation_; + // rt->activation()->active_ = false; + // rt->jitTop = prevJitTop_; + // rt->jitJSContext = prevJitJSContext_; + // rt->jitActivation = prevJitActivation_; // On the ARM store8() uses the secondScratchReg (lr) as a temp. - size_t offsetOfActivation = offsetof(JSRuntime, mainThread) + - PerThreadData::offsetOfActivation(); - size_t offsetOfJitTop = offsetof(JSRuntime, mainThread) + offsetof(PerThreadData, jitTop); - size_t offsetOfJitJSContext = offsetof(JSRuntime, mainThread) + - offsetof(PerThreadData, jitJSContext); - size_t offsetOfJitActivation = offsetof(JSRuntime, mainThread) + - offsetof(PerThreadData, jitActivation); - size_t offsetOfProfilingActivation = offsetof(JSRuntime, mainThread) + - PerThreadData::offsetOfProfilingActivation(); + size_t offsetOfActivation = JSRuntime::offsetOfActivation(); + size_t offsetOfJitTop = offsetof(JSRuntime, jitTop); + size_t offsetOfJitJSContext = offsetof(JSRuntime, jitJSContext); + size_t offsetOfJitActivation = offsetof(JSRuntime, jitActivation); + size_t offsetOfProfilingActivation = JSRuntime::offsetOfProfilingActivation(); masm.movePtr(AsmJSImmPtr(AsmJSImm_Runtime), reg0); masm.loadPtr(Address(reg0, offsetOfActivation), reg1); - // rt->mainThread.jitTop = prevJitTop_; + // rt->jitTop = prevJitTop_; masm.loadPtr(Address(reg1, JitActivation::offsetOfPrevJitTop()), reg2); masm.storePtr(reg2, Address(reg0, offsetOfJitTop)); - // rt->mainThread.profilingActivation = rt->mainThread.activation()->prevProfiling_; + // rt->profilingActivation = rt->activation()->prevProfiling_; masm.loadPtr(Address(reg1, Activation::offsetOfPrevProfiling()), reg2); masm.storePtr(reg2, Address(reg0, offsetOfProfilingActivation)); - // rt->mainThread.activation()->active_ = false; + // rt->activation()->active_ = false; masm.store8(Imm32(0), Address(reg1, JitActivation::offsetOfActiveUint8())); - // rt->mainThread.jitJSContext = prevJitJSContext_; + // rt->jitJSContext = prevJitJSContext_; masm.loadPtr(Address(reg1, JitActivation::offsetOfPrevJitJSContext()), reg2); masm.storePtr(reg2, Address(reg0, offsetOfJitJSContext)); - // rt->mainThread.jitActivation = prevJitActivation_; + // rt->jitActivation = prevJitActivation_; masm.loadPtr(Address(reg1, JitActivation::offsetOfPrevJitActivation()), reg2); masm.storePtr(reg2, Address(reg0, offsetOfJitActivation)); } diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp index 2122f6e0e174..ea8757454a05 100644 --- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -1353,11 +1353,11 @@ js::testingFunc_assertFloat32(JSContext *cx, unsigned argc, jsval *vp) } static bool -TestingFunc_assertValidJitStack(JSContext *cx, unsigned argc, jsval *vp) +TestingFunc_assertJitStackInvariants(JSContext *cx, unsigned argc, jsval *vp) { CallArgs args = CallArgsFromVp(argc, vp); - jit::AssertValidJitStack(cx); + jit::AssertJitStackInvariants(cx); args.rval().setUndefined(); return true; } @@ -2499,8 +2499,8 @@ gc::ZealModeHelpText), "bailout()", " Force a bailout out of ionmonkey (if running in ionmonkey)."), - JS_FN_HELP("assertValidJitStack", TestingFunc_assertValidJitStack, 0, 0, -"assertValidJitStack()", + JS_FN_HELP("assertJitStackInvariants", TestingFunc_assertJitStackInvariants, 0, 0, +"assertJitStackInvariants()", " Iterates the Jit stack and check that stack invariants hold."), JS_FN_HELP("setJitCompilerOption", SetJitCompilerOption, 2, 0, diff --git a/js/src/devtools/rootAnalysis/README.txt b/js/src/devtools/rootAnalysis/README.txt index 7e771e09ddbb..d2102417394b 100644 --- a/js/src/devtools/rootAnalysis/README.txt +++ b/js/src/devtools/rootAnalysis/README.txt @@ -1,39 +1,49 @@ +# Spidermonkey JSAPI rooting analysis + This directory contains scripts and a makefile for running Brian Hackett's static GC rooting analysis on a JS source directory. -To use it: +To use it on SpiderMonkey: -1. Download and compile sixgill. Make sure the gcc plugin is enabled. (The - configure output will tell you.) +1. Be on Fedora/CentOS/RedHat Linux x86_64. - - [sfink] I needed a couple of patches to get it work on Fedora 16/17/18. - Ask me if you need them. + (Specifically, the prebuilt GCC **won't work on Ubuntu** + without the `CFLAGS` and `CXXFLAGS` settings from + http://trac.wildfiregames.com/wiki/StaticRootingAnalysis .) -2. Compile an optimized JS shell that includes the patch at - . This does not - need to be in the same source tree as you are running these scripts from. - Remember the full path to the resulting JS binary; we'll call it $JS_SHELL - below. +2. Have the Gecko build prerequisites installed. -3. |make clean| in the objdir of the JS source tree that you're going to be - analyzing. (These analysis scripts will default to the tree they are within, - but you can point them at another tree.) +3. In this directory, run these commands. -4. in $objdir/js/src/devtools/analysis, |make JS=$JS_SHELL - SIXGILL=.../path/to/sixgill...|. You may need one or more of the following - additional settings in addition to the |JS| already given: + mkdir builddir + cd builddir + ../run-analysis.sh - - JSOBJDIR: if you are analyzing a different source tree, set this to the - objdir of the tree you want to analyze. +`run-analysis.sh` is kind of like `configure` and `make` combined: +the build directory can be wherever you want +and you can name it whatever you want. +(You could just run it right here in the source tree, and it would work, +but don't do that -- it spits out files all over the place and +then you'd have to clean up your source tree later.) - - ANALYSIS_SCRIPT_DIR: by default, the *.js files within the directory - containing this README will be used, but you can point to a different - directory full. At the time of this writing, there are some changes not in - bhackett's git repo that are necessary, and you'll also need the - gen-hazards.sh shell script. +Output goes to `hazards.txt` in the builddir. - - JOBS: set this to the number of parallel jobs you'd like to run the final - analysis pass with. This defaults to 6, somewhat randomly, which gave me a - large speedup even on a machine with only 2 cores. +To use this analysis on any other codebase, +make a copy of `run-analysis.sh` and adapt it for your code. + + +## Overview of what is going on here + +So what does `run-analysis.sh` actually do? + +1. **It insecurely downloads software over HTTP.** Yeah. + See `run-analysis.sh` for details. + +2. It runs `run_complete`, a Perl script, which builds the target + codebase with a custom hacked GCC, generating a few database files + containing (among other data) the full call graph. + +3. Then it runs `analyze.py`, a Python script, which runs all the scripts + which actually perform the analysis -- the tricky parts. + (Those scripts are written in JS.) -The results will be in rootingHazards.txt diff --git a/js/src/devtools/rootAnalysis/run-analysis.sh b/js/src/devtools/rootAnalysis/run-analysis.sh new file mode 100755 index 000000000000..c1729648bf3b --- /dev/null +++ b/js/src/devtools/rootAnalysis/run-analysis.sh @@ -0,0 +1,85 @@ +# setup.sh - Run the rooting analysis on SpiderMonkey. See `README.txt` for usage. +# +# This script is based on the wiki page: +# http://trac.wildfiregames.com/wiki/StaticRootingAnalysis + +set -eu + +BUILD_DIR="$PWD" +ANALYSIS_SCRIPTDIR="$(dirname $0)" +MOZILLA_SRCDIR="$(cd $ANALYSIS_SCRIPTDIR && (hg root || git rev-parse --show-toplevel))" + + +# Requirements +# ============ +# +# Download and unpack the Sixgill plugin binaries. +# (`wget -c` skips the download if you've already got the file.) +# +# This insecurely downloads software over HTTP. Sorry. +# +# The alternative is building your own Sixgill. That can be a pain and you may +# need some patches to get it to work on your Linux distribution. Ask sfink for +# details. + +mkdir -p downloads +(cd downloads && wget -c http://people.mozilla.org/~sfink/data/hazards-sixgill.tar.xz) +tar xf downloads/hazards-sixgill.tar.xz + +# Download and unpack GCC binaries compatible with the Sixgill plugin. +(cd downloads && wget -c http://people.mozilla.org/~sfink/data/hazards-gcc4.7.tar.xz) +tar xf downloads/hazards-gcc4.7.tar.xz + + +# Generate raw data (.xdb files) +# ============================== +# +# The first step is to generate the .xdb files that contain the information +# needed by the analysis. This is done by compiling SpiderMonkey with the +# sixgill plugin enabled. The plugin creates .xdb files which the analysis +# consumes. + +PATH=$BUILD_DIR/sixgill/usr/bin:$PATH +export PATH +GCCDIR=$BUILD_DIR/gcc/bin +export GCCDIR + +# Create a SpiderMonkey build directory and run configure. +mkdir -p spidermonkey-analysis +(cd spidermonkey-analysis && \ + $MOZILLA_SRCDIR/js/src/configure --enable-optimize) + +# Make SpiderMonkey. +$MOZILLA_SRCDIR/js/src/devtools/rootAnalysis/run_complete \ + --build-root=$BUILD_DIR/spidermonkey-analysis \ + --binaries=$BUILD_DIR/sixgill/usr/bin \ + --wrap-dir=$BUILD_DIR/sixgill/usr/libexec/sixgill/scripts/wrap_gcc \ + --buildcommand='make' \ + --foreground \ + --no-logs \ + . + + +# Run the analysis +# ================ + +# Build *another* copy of SpiderMonkey, using the system C++ compiler, without +# Sixgill. This is what we use to run the analysis. (We don't let you skip this +# step by setting a $JS environment variable or something, because you need +# ctypes. Relax and spin a build. Get yourself a cup of tea.) +mkdir -p spidermonkey-opt +(cd spidermonkey-opt && \ + $MOZILLA_SRCDIR/js/src/configure --enable-optimize --enable-ctypes --enable-nspr-build && \ + make -j8) +JS="$BUILD_DIR/spidermonkey-opt/dist/bin/js" + +# Write a config file used by analyze.py. +rm -f defaults.py +echo "objdir = '${BUILD_DIR}/spidermonkey-analysis'" >> defaults.py +echo "sixgill = '${BUILD_DIR}/sixgill/usr/libexec/sixgill'" >> defaults.py +echo "sixgill_bin = '${BUILD_DIR}/sixgill/usr/bin'" >> defaults.py +echo "js = '${JS}'" >> defaults.py +echo "analysis_scriptdir = '${ANALYSIS_SCRIPTDIR}'" >> defaults.py + +# Run the script that runs the scripts that do the analysis. +python2.7 "${MOZILLA_SRCDIR}/js/src/devtools/rootAnalysis/analyze.py" -j 8 callgraph diff --git a/js/src/irregexp/NativeRegExpMacroAssembler.cpp b/js/src/irregexp/NativeRegExpMacroAssembler.cpp index 9dbdd007a178..3e0def1f0eef 100644 --- a/js/src/irregexp/NativeRegExpMacroAssembler.cpp +++ b/js/src/irregexp/NativeRegExpMacroAssembler.cpp @@ -152,7 +152,7 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext *cx, bool match_only) // Check if we have space on the stack. Label stack_ok; - void *stack_limit = runtime->mainThread.addressOfJitStackLimit(); + void *stack_limit = runtime->addressOfJitStackLimit(); masm.branchPtr(Assembler::Below, AbsoluteAddress(stack_limit), StackPointer, &stack_ok); // Exit with an exception. There is not enough space on the stack @@ -262,7 +262,7 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext *cx, bool match_only) } // Initialize backtrack stack pointer. - masm.loadPtr(AbsoluteAddress(runtime->mainThread.regexpStack.addressOfBase()), backtrack_stack_pointer); + masm.loadPtr(AbsoluteAddress(runtime->regexpStack.addressOfBase()), backtrack_stack_pointer); masm.storePtr(backtrack_stack_pointer, Address(StackPointer, offsetof(FrameData, backtrackStackBase))); masm.jump(&start_label_); @@ -422,7 +422,7 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext *cx, bool match_only) Address backtrackStackBaseAddress(temp2, offsetof(FrameData, backtrackStackBase)); masm.subPtr(backtrackStackBaseAddress, backtrack_stack_pointer); - masm.loadPtr(AbsoluteAddress(runtime->mainThread.regexpStack.addressOfBase()), temp1); + masm.loadPtr(AbsoluteAddress(runtime->regexpStack.addressOfBase()), temp1); masm.storePtr(temp1, backtrackStackBaseAddress); masm.addPtr(temp1, backtrack_stack_pointer); @@ -1050,7 +1050,7 @@ NativeRegExpMacroAssembler::CheckBacktrackStackLimit() { JitSpew(SPEW_PREFIX "CheckBacktrackStackLimit"); - const void *limitAddr = runtime->mainThread.regexpStack.addressOfLimit(); + const void *limitAddr = runtime->regexpStack.addressOfLimit(); Label no_stack_overflow; masm.branchPtr(Assembler::AboveOrEqual, AbsoluteAddress(limitAddr), diff --git a/js/src/irregexp/RegExpStack.cpp b/js/src/irregexp/RegExpStack.cpp index 26ff0eebf9fc..f1d3642f9cb5 100644 --- a/js/src/irregexp/RegExpStack.cpp +++ b/js/src/irregexp/RegExpStack.cpp @@ -36,7 +36,7 @@ using namespace js; using namespace js::irregexp; RegExpStackScope::RegExpStackScope(JSRuntime *rt) - : regexp_stack(&rt->mainThread.regexpStack) + : regexp_stack(&rt->regexpStack) {} RegExpStackScope::~RegExpStackScope() @@ -47,7 +47,7 @@ RegExpStackScope::~RegExpStackScope() int irregexp::GrowBacktrackStack(JSRuntime *rt) { - return rt->mainThread.regexpStack.grow(); + return rt->regexpStack.grow(); } RegExpStack::RegExpStack() diff --git a/js/src/jit-test/tests/asm.js/bug1122338.js b/js/src/jit-test/tests/asm.js/bug1122338.js new file mode 100644 index 000000000000..b63352b86ac3 --- /dev/null +++ b/js/src/jit-test/tests/asm.js/bug1122338.js @@ -0,0 +1,38 @@ +// The bug was that the asm.js linker did not catch that an unshared +// view was created on a shared buffer. (Nor did it catch the vice +// versa case.) As a consequence the code was not rejected (and run +// as plain JS) as it should be. That gave rise to a difference in +// output. + +// Original test + +g = (function(stdlib, n, heap) { + "use asm"; + var Float32ArrayView = new stdlib.Float32Array(heap); + function f() { + return +Float32ArrayView[0] + } + return f +})(this, {}, new SharedArrayBuffer(4096)); +assertEq(g(), NaN); + +// Additional test: vice versa case. + +try { + g = (function(stdlib, n, heap) { + "use asm"; + var Float32ArrayView = new stdlib.SharedFloat32Array(heap); + function f() { + return +Float32ArrayView[0] + } + return f + })(this, {}, new ArrayBuffer(4096)); + // If the code runs, as it would with the bug present, it must return NaN. + assertEq(g(), NaN); +} +catch (e) { + // If the code throws then that's OK too. The current (January 2015) + // semantics is for the SharedFloat32Array constructor to throw if + // handed an ArrayBuffer, but asm.js does not execute that constructor + // and before the fix it would not throw. +} diff --git a/js/src/jit-test/tests/debug/resumption-error-01.js b/js/src/jit-test/tests/debug/resumption-error-01.js new file mode 100644 index 000000000000..76e2717ce8a4 --- /dev/null +++ b/js/src/jit-test/tests/debug/resumption-error-01.js @@ -0,0 +1,7 @@ +// A resumption value can't have both {return:} and {throw:} properties. + +var g = newGlobal(); +var dbg = Debugger(g); +dbg.onDebuggerStatement = stack => ({return: 1, throw: 2}); +dbg.uncaughtExceptionHook = exc => ({return: "corrected"}); +assertEq(g.eval("debugger; false;"), "corrected"); diff --git a/js/src/jit-test/tests/debug/resumption-error-02.js b/js/src/jit-test/tests/debug/resumption-error-02.js new file mode 100644 index 000000000000..be5bf54b98c2 --- /dev/null +++ b/js/src/jit-test/tests/debug/resumption-error-02.js @@ -0,0 +1,16 @@ +// Error handling if parsing a resumption value throws. + +var g = newGlobal(); +var dbg = Debugger(g); +var rv; +dbg.onDebuggerStatement = stack => rv; +dbg.uncaughtExceptionHook = function (exc) { + assertEq(exc, "BANG"); + return {return: "recovered"}; +}; + +rv = {get throw() { throw "BANG"; }}; +assertEq(g.eval("debugger; false;"), "recovered"); + +rv = new Proxy({}, {has() { throw "BANG"; }}); +assertEq(g.eval("debugger; false;"), "recovered"); diff --git a/js/src/jit-test/tests/ion/simd-unbox.js b/js/src/jit-test/tests/ion/simd-unbox.js new file mode 100644 index 000000000000..0e62b0465148 --- /dev/null +++ b/js/src/jit-test/tests/ion/simd-unbox.js @@ -0,0 +1,108 @@ +if (typeof SIMD === "undefined") + quit(); + +setJitCompilerOption("baseline.warmup.trigger", 10); +setJitCompilerOption("ion.warmup.trigger", 30); +var max = 40, pivot = 35; + +var i32x4 = SIMD.int32x4; +var f32x4 = SIMD.float32x4; +var i32x4Add = SIMD.int32x4.add; + +var FakeSIMDType = function (o) { this.x = o.x; this.y = o.y; this.z = o.z; this.w = o.w; }; +if (this.hasOwnProperty("TypedObject")) { + var TO = TypedObject; + FakeSIMDType = new TO.StructType({ x: TO.int32, y: TO.int32, z: TO.int32, w: TO.int32 }); +} + + +function simdunbox_bail_undef(i, lhs, rhs) { + return i32x4Add(lhs, rhs); +} + +function simdunbox_bail_object(i, lhs, rhs) { + return i32x4Add(lhs, rhs); +} + +function simdunbox_bail_typeobj(i, lhs, rhs) { + return i32x4Add(lhs, rhs); +} + +function simdunbox_bail_badsimd(i, lhs, rhs) { + return i32x4Add(lhs, rhs); +} + +var arr_undef = [ i32x4(0, 1, 1, 2), i32x4(1, 1, 2, 3) ]; +var fail_undef = 0; +var arr_object = [ i32x4(0, 1, 1, 2), i32x4(1, 1, 2, 3) ]; +var fail_object = 0; +var arr_typeobj = [ i32x4(0, 1, 1, 2), i32x4(1, 1, 2, 3) ]; +var fail_typeobj = 0; +var arr_badsimd = [ i32x4(0, 1, 1, 2), i32x4(1, 1, 2, 3) ]; +var fail_badsimd = 0; +for (var i = 0; i < max; i++) { + try { + arr_undef[i + 2] = simdunbox_bail_undef(i, arr_undef[i], arr_undef[i + 1]); + } catch (x) { + arr_undef[i + 2] = arr_undef[i - 1]; + fail_undef++; + } + + try { + arr_object[i + 2] = simdunbox_bail_object(i, arr_object[i], arr_object[i + 1]); + } catch (x) { + arr_object[i + 2] = arr_object[i - 1]; + fail_object++; + } + + try { + arr_typeobj[i + 2] = simdunbox_bail_typeobj(i, arr_typeobj[i], arr_typeobj[i + 1]); + } catch (x) { + arr_typeobj[i + 2] = arr_typeobj[i - 1]; + fail_typeobj++; + } + + try { + arr_badsimd[i + 2] = simdunbox_bail_badsimd(i, arr_badsimd[i], arr_badsimd[i + 1]); + } catch (x) { + arr_badsimd[i + 2] = arr_badsimd[i - 1]; + fail_badsimd++; + } + + if (i + 2 == pivot) { + arr_undef[pivot] = undefined; + arr_object[pivot] = { x: 0, y: 1, z: 2, w: 3 }; + arr_typeobj[pivot] = new FakeSIMDType({ x: 0, y: 1, z: 2, w: 3 }); + arr_badsimd[pivot] = f32x4(0, 1, 2, 3); + } +} + +assertEq(fail_undef, 2); +assertEq(fail_object, 2); +assertEq(fail_typeobj, 2); +assertEq(fail_badsimd, 2); + +// Assert that all SIMD values are correct. +function assertEqX4(real, expected, assertFunc) { + if (typeof assertFunc === 'undefined') + assertFunc = assertEq; + + assertFunc(real.x, expected[0]); + assertFunc(real.y, expected[1]); + assertFunc(real.z, expected[2]); + assertFunc(real.w, expected[3]); +} + +var fib = [0, 1]; +for (i = 0; i < max + 5; i++) + fib[i+2] = (fib[i] + fib[i+1]) | 0; + +for (i = 0; i < max; i++) { + if (i == pivot) + continue; + var ref = fib.slice(i < pivot ? i : i - 3); + assertEqX4(arr_undef[i], ref); + assertEqX4(arr_object[i], ref); + assertEqX4(arr_typeobj[i], ref); + assertEqX4(arr_badsimd[i], ref); +} diff --git a/js/src/jit-test/tests/ion/stack-alignment.js b/js/src/jit-test/tests/ion/stack-alignment.js index cd65ed293ee9..b5d4ad4c61a4 100644 --- a/js/src/jit-test/tests/ion/stack-alignment.js +++ b/js/src/jit-test/tests/ion/stack-alignment.js @@ -4,11 +4,33 @@ var i; // Check that an entry frame is always aligned properly. function entryFrame_1() { - assertValidJitStack(); + assertJitStackInvariants(); +} + +// Check rectifier frames are keeping the same alignment. +function rectifierFrame_verify(a, b, c, d) { + assertJitStackInvariants(); +} + +function rectifierFrame_1(i) { + rectifierFrame_verify(); +} +function rectifierFrame_2(i) { + rectifierFrame_verify(i); +} +function rectifierFrame_3(i) { + rectifierFrame_verify(i, i); +} +function rectifierFrame_4(i) { + rectifierFrame_verify(i, i, i); } for (i = 0; i < 40; i++) { entryFrame_1(); entryFrame_1(0); entryFrame_1(0, 1); + rectifierFrame_1(i); + rectifierFrame_2(i); + rectifierFrame_3(i); + rectifierFrame_4(i); } diff --git a/js/src/jit-test/tests/proxy/testDirectProxyGetInherited1.js b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited1.js new file mode 100644 index 000000000000..fc2dc0388fd9 --- /dev/null +++ b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited1.js @@ -0,0 +1,16 @@ +// Getting a property that exists on an ordinary object +// does not touch a proxy on its proto chain. + +load(libdir + "asserts.js"); + +var angryHandler = new Proxy({}, { + get(t, id) { throw new Error("angryHandler should not be queried (" + id + ")"); } +}); +var angryProto = new Proxy({}, angryHandler); +var obj = Object.create(angryProto, { + x: {value: 3}, + y: {get: () => 4} +}); +assertThrowsInstanceOf(() => obj.z, Error); // check that angryProto works +assertEq(obj.x, 3); +assertEq(obj.y, 4); diff --git a/js/src/jit-test/tests/proxy/testDirectProxyGetInherited2.js b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited2.js new file mode 100644 index 000000000000..3c58e314ea08 --- /dev/null +++ b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited2.js @@ -0,0 +1,31 @@ +// Getting a property that's inherted from a proxy calls the proxy's get handler. + +var handler = { + get(t, id, r) { + assertEq(this, handler); + assertEq(t, target); + assertEq(id, "foo"); + assertEq(r, obj); + return "bar"; + }, + getOwnPropertyDescriptor(t, id) { + throw "FAIL"; + } +}; + +var target = {}; +var proto = new Proxy(target, handler); +var obj = Object.create(proto); +assertEq(obj.foo, "bar"); + +// Longer proto chain: same result. +var origObj = obj; +for (var i = 0; i < 4; i++) + obj = Object.create(obj); +assertEq(obj.foo, "bar"); + +// Chain of transparent proxy wrappers: same result. +obj = origObj; +for (var i = 0; i < 4; i++) + obj = new Proxy(obj, {}); +assertEq(obj.foo, "bar"); diff --git a/js/src/jit-test/tests/proxy/testDirectProxyGetInherited3.js b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited3.js new file mode 100644 index 000000000000..d9f34e60e890 --- /dev/null +++ b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited3.js @@ -0,0 +1,21 @@ +// Recursion through the get hook works; runaway recursion is checked. + +load(libdir + "asserts.js"); + +var hits = 0, limit = 10; +var proto = new Proxy({}, { + get(t, id, r) { + assertEq(r, obj); + if (hits++ >= limit) + return "ding"; + return obj[id]; + } +}); + +var obj = Object.create(proto); +assertEq(obj.prop, "ding"); + +hits = 0; +limit = Infinity; +assertThrowsInstanceOf(() => obj.prop, InternalError); +assertEq(hits > 10, true); diff --git a/js/src/jit-test/tests/proxy/testDirectProxyGetInherited4.js b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited4.js new file mode 100644 index 000000000000..b1cf4a905339 --- /dev/null +++ b/js/src/jit-test/tests/proxy/testDirectProxyGetInherited4.js @@ -0,0 +1,6 @@ +// A proxy P whose target is an object X whose prototype is an array V inherits V.length. + +var V = [1, 2, 3]; +var X = Object.create(V); +var P = new Proxy(X, {}); +assertEq(P.length, 3); diff --git a/js/src/jit-test/tests/proxy/testWrapperGetInherited.js b/js/src/jit-test/tests/proxy/testWrapperGetInherited.js new file mode 100644 index 000000000000..1ff767e9208e --- /dev/null +++ b/js/src/jit-test/tests/proxy/testWrapperGetInherited.js @@ -0,0 +1,18 @@ +// Getting a property O.X, inherited from a transparent cross-compartment wrapper W +// that wraps a Proxy P. + +var g = newGlobal(); +var target = {} +var P = new Proxy(target, { + get(t, id, r) { + assertEq(t, target); + assertEq(id, "X"); + assertEq(r, wO); + return "vega"; + } +}); + +g.W = P; +g.eval("var O = Object.create(W);"); +var wO = g.O; +assertEq(g.eval("O.X"), "vega"); diff --git a/js/src/jit/BacktrackingAllocator.cpp b/js/src/jit/BacktrackingAllocator.cpp index 7b6eae7d4574..c64a7b638fa7 100644 --- a/js/src/jit/BacktrackingAllocator.cpp +++ b/js/src/jit/BacktrackingAllocator.cpp @@ -101,6 +101,7 @@ BacktrackingAllocator::go() dumpRegisterGroups(); JitSpew(JitSpew_RegAlloc, "Beginning main allocation loop"); + // Allocate, spill and split register intervals until finished. while (!allocationQueue.empty()) { if (mir->shouldCancel("Backtracking Allocation")) @@ -112,10 +113,22 @@ BacktrackingAllocator::go() } JitSpew(JitSpew_RegAlloc, "Main allocation loop complete"); + if (!pickStackSlots()) + return false; + if (JitSpewEnabled(JitSpew_RegAlloc)) dumpAllocations(); - return resolveControlFlow() && reifyAllocations() && populateSafepoints(); + if (!resolveControlFlow()) + return false; + + if (!reifyAllocations()) + return false; + + if (!populateSafepoints()) + return false; + + return true; } static bool @@ -383,6 +396,7 @@ BacktrackingAllocator::groupAndQueueRegisters() // for that slot, and reuse it for other registers in the group. LDefinition *def = reg.def(); if (def->policy() == LDefinition::FIXED && !def->output()->isRegister()) { + MOZ_ASSERT(!def->output()->isStackSlot()); reg.setCanonicalSpill(*def->output()); if (reg.group() && reg.group()->spill.isUse()) reg.group()->spill = *def->output(); @@ -930,10 +944,11 @@ BacktrackingAllocator::spill(LiveInterval *interval) } } - uint32_t stackSlot = stackSlotAllocator.allocateSlot(reg->type()); - MOZ_ASSERT(stackSlot <= stackSlotAllocator.stackHeight()); + uint32_t virtualSlot = numVirtualStackSlots++; - LStackSlot alloc(stackSlot); + // Count virtual stack slots down from the maximum representable value, so + // that virtual slots are more obviously distinguished from real slots. + LStackSlot alloc(LAllocation::DATA_MASK - virtualSlot); interval->setAllocation(alloc); JitSpew(JitSpew_RegAlloc, " Allocating spill location %s", alloc.toString()); @@ -945,6 +960,179 @@ BacktrackingAllocator::spill(LiveInterval *interval) } } +bool +BacktrackingAllocator::pickStackSlots() +{ + for (size_t i = 1; i < graph.numVirtualRegisters(); i++) { + BacktrackingVirtualRegister *reg = &vregs[i]; + + if (mir->shouldCancel("Backtracking Pick Stack Slots")) + return false; + + for (size_t j = 0; j < reg->numIntervals(); j++) { + LiveInterval *interval = reg->getInterval(j); + if (!pickStackSlot(interval)) + return false; + } + } + + return true; +} + +bool +BacktrackingAllocator::pickStackSlot(LiveInterval *interval) +{ + LAllocation alloc = *interval->getAllocation(); + MOZ_ASSERT(!alloc.isUse()); + + if (!isVirtualStackSlot(alloc)) + return true; + + BacktrackingVirtualRegister ® = vregs[interval->vreg()]; + + // Get a list of all the intervals which will share this stack slot. + LiveIntervalVector commonIntervals; + + if (!commonIntervals.append(interval)) + return false; + + if (reg.canonicalSpill() && alloc == *reg.canonicalSpill()) { + // Look for other intervals in the vreg using this spill slot. + for (size_t i = 0; i < reg.numIntervals(); i++) { + LiveInterval *ninterval = reg.getInterval(i); + if (ninterval != interval && *ninterval->getAllocation() == alloc) { + if (!commonIntervals.append(ninterval)) + return false; + } + } + + // Look for intervals in other registers with the same group using this + // spill slot. + if (reg.group() && alloc == reg.group()->spill) { + for (size_t i = 0; i < reg.group()->registers.length(); i++) { + uint32_t nvreg = reg.group()->registers[i]; + if (nvreg == interval->vreg()) + continue; + BacktrackingVirtualRegister &nreg = vregs[nvreg]; + for (size_t j = 0; j < nreg.numIntervals(); j++) { + LiveInterval *ninterval = nreg.getInterval(j); + if (*ninterval->getAllocation() == alloc) { + if (!commonIntervals.append(ninterval)) + return false; + } + } + } + } + } else { + MOZ_ASSERT_IF(reg.group(), alloc != reg.group()->spill); + } + + if (!reuseOrAllocateStackSlot(commonIntervals, reg.type(), &alloc)) + return false; + + MOZ_ASSERT(!isVirtualStackSlot(alloc)); + + // Set the physical stack slot for each of the intervals found earlier. + for (size_t i = 0; i < commonIntervals.length(); i++) + commonIntervals[i]->setAllocation(alloc); + + return true; +} + +bool +BacktrackingAllocator::reuseOrAllocateStackSlot(const LiveIntervalVector &intervals, LDefinition::Type type, + LAllocation *palloc) +{ + SpillSlotList *slotList; + switch (StackSlotAllocator::width(type)) { + case 4: slotList = &normalSlots; break; + case 8: slotList = &doubleSlots; break; + case 16: slotList = &quadSlots; break; + default: + MOZ_CRASH("Bad width"); + } + + // Maximum number of existing spill slots we will look at before giving up + // and allocating a new slot. + static const size_t MAX_SEARCH_COUNT = 10; + + if (!slotList->empty()) { + size_t searches = 0; + SpillSlot *stop = nullptr; + while (true) { + SpillSlot *spill = *slotList->begin(); + if (!stop) { + stop = spill; + } else if (stop == spill) { + // We looked through every slot in the list. + break; + } + + bool success = true; + for (size_t i = 0; i < intervals.length() && success; i++) { + LiveInterval *interval = intervals[i]; + for (size_t j = 0; j < interval->numRanges(); j++) { + AllocatedRange range(interval, interval->getRange(j)), existing; + if (spill->allocated.contains(range, &existing)) { + success = false; + break; + } + } + } + if (success) { + // We can reuse this physical stack slot for the new intervals. + // Update the allocated ranges for the slot. + if (!insertAllRanges(spill->allocated, intervals)) + return false; + *palloc = spill->alloc; + return true; + } + + // On a miss, move the spill to the end of the list. This will cause us + // to make fewer attempts to allocate from slots with a large and + // highly contended range. + slotList->popFront(); + slotList->pushBack(spill); + + if (++searches == MAX_SEARCH_COUNT) + break; + } + } + + // We need a new physical stack slot. + uint32_t stackSlot = stackSlotAllocator.allocateSlot(type); + + // Make sure the virtual and physical stack slots don't start overlapping. + if (isVirtualStackSlot(LStackSlot(stackSlot))) + return false; + + SpillSlot *spill = new(alloc()) SpillSlot(stackSlot, alloc().lifoAlloc()); + if (!spill) + return false; + + if (!insertAllRanges(spill->allocated, intervals)) + return false; + + *palloc = spill->alloc; + + slotList->pushFront(spill); + return true; +} + +bool +BacktrackingAllocator::insertAllRanges(AllocatedRangeSet &set, const LiveIntervalVector &intervals) +{ + for (size_t i = 0; i < intervals.length(); i++) { + LiveInterval *interval = intervals[i]; + for (size_t j = 0; j < interval->numRanges(); j++) { + AllocatedRange range(interval, interval->getRange(j)); + if (!set.insert(range)) + return false; + } + } + return true; +} + // Add moves to resolve conflicting assignments between a block and its // predecessors. XXX try to common this with LinearScanAllocator. bool diff --git a/js/src/jit/BacktrackingAllocator.h b/js/src/jit/BacktrackingAllocator.h index 93e57b7d9661..82e78e59ebff 100644 --- a/js/src/jit/BacktrackingAllocator.h +++ b/js/src/jit/BacktrackingAllocator.h @@ -176,9 +176,28 @@ class BacktrackingAllocator // should be prioritized. AllocatedRangeSet hotcode; + // During register allocation, virtual stack slots are used for spills. + // These are converted to actual spill locations + size_t numVirtualStackSlots; + + // Information about an allocated stack slot. + struct SpillSlot : public TempObject, public InlineForwardListNode { + LStackSlot alloc; + AllocatedRangeSet allocated; + + SpillSlot(uint32_t slot, LifoAlloc *alloc) + : alloc(slot), allocated(alloc) + {} + }; + typedef InlineForwardList SpillSlotList; + + // All allocated slots of each width. + SpillSlotList normalSlots, doubleSlots, quadSlots; + public: BacktrackingAllocator(MIRGenerator *mir, LIRGenerator *lir, LIRGraph &graph) - : LiveRangeAllocator(mir, lir, graph) + : LiveRangeAllocator(mir, lir, graph), + numVirtualStackSlots(0) { } bool go(); @@ -213,7 +232,12 @@ class BacktrackingAllocator bool addLiveInterval(LiveIntervalVector &intervals, uint32_t vreg, LiveInterval *spillInterval, CodePosition from, CodePosition to); + bool pickStackSlot(LiveInterval *interval); + bool reuseOrAllocateStackSlot(const LiveIntervalVector &intervals, LDefinition::Type type, + LAllocation *palloc); + bool insertAllRanges(AllocatedRangeSet &set, const LiveIntervalVector &intervals); + bool pickStackSlots(); bool resolveControlFlow(); bool reifyAllocations(); bool populateSafepoints(); @@ -249,6 +273,11 @@ class BacktrackingAllocator bool compilingAsmJS() { return mir->info().compilingAsmJS(); } + + bool isVirtualStackSlot(LAllocation alloc) { + return alloc.isStackSlot() && + LAllocation::DATA_MASK - alloc.toStackSlot()->slot() < numVirtualStackSlots; + } }; } // namespace jit diff --git a/js/src/jit/Bailouts.cpp b/js/src/jit/Bailouts.cpp index 2daf8612e422..54ae77f69bb2 100644 --- a/js/src/jit/Bailouts.cpp +++ b/js/src/jit/Bailouts.cpp @@ -34,7 +34,7 @@ jit::Bailout(BailoutStack *sp, BaselineBailoutInfo **bailoutInfo) MOZ_ASSERT(IsInRange(FAKE_JIT_TOP_FOR_BAILOUT, 0, 0x1000) && IsInRange(FAKE_JIT_TOP_FOR_BAILOUT + sizeof(CommonFrameLayout), 0, 0x1000), "Fake jitTop pointer should be within the first page."); - cx->mainThread().jitTop = FAKE_JIT_TOP_FOR_BAILOUT; + cx->runtime()->jitTop = FAKE_JIT_TOP_FOR_BAILOUT; JitActivationIterator jitActivations(cx->runtime()); BailoutFrameInfo bailoutData(jitActivations, sp); @@ -94,7 +94,7 @@ jit::Bailout(BailoutStack *sp, BaselineBailoutInfo **bailoutInfo) // In both cases, we want to temporarily set the |lastProfilingFrame| // to the current frame being bailed out, and then fix it up later. if (cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime())) - cx->mainThread().jitActivation->setLastProfilingFrame(currentFramePtr); + cx->runtime()->jitActivation->setLastProfilingFrame(currentFramePtr); return retval; } @@ -108,7 +108,7 @@ jit::InvalidationBailout(InvalidationBailoutStack *sp, size_t *frameSizeOut, JSContext *cx = GetJSContextFromJitCode(); // We don't have an exit frame. - cx->mainThread().jitTop = FAKE_JIT_TOP_FOR_BAILOUT; + cx->runtime()->jitTop = FAKE_JIT_TOP_FOR_BAILOUT; JitActivationIterator jitActivations(cx->runtime()); BailoutFrameInfo bailoutData(jitActivations, sp); @@ -168,7 +168,7 @@ jit::InvalidationBailout(InvalidationBailoutStack *sp, size_t *frameSizeOut, // Make the frame being bailed out the top profiled frame. if (cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime())) - cx->mainThread().jitActivation->setLastProfilingFrame(currentFramePtr); + cx->runtime()->jitActivation->setLastProfilingFrame(currentFramePtr); return retval; } @@ -197,7 +197,7 @@ jit::ExceptionHandlerBailout(JSContext *cx, const InlineFrameIterator &frame, // operation callback like a timeout handler. MOZ_ASSERT_IF(!excInfo.propagatingIonExceptionForDebugMode(), cx->isExceptionPending()); - cx->mainThread().jitTop = FAKE_JIT_TOP_FOR_BAILOUT; + cx->runtime()->jitTop = FAKE_JIT_TOP_FOR_BAILOUT; gc::AutoSuppressGC suppress(cx); JitActivationIterator jitActivations(cx->runtime()); @@ -238,7 +238,7 @@ jit::ExceptionHandlerBailout(JSContext *cx, const InlineFrameIterator &frame, // Make the frame being bailed out the top profiled frame. if (cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime())) - cx->mainThread().jitActivation->setLastProfilingFrame(currentFramePtr); + cx->runtime()->jitActivation->setLastProfilingFrame(currentFramePtr); return retval; } diff --git a/js/src/jit/BaselineBailouts.cpp b/js/src/jit/BaselineBailouts.cpp index f5b29abd9e89..765fdee0f606 100644 --- a/js/src/jit/BaselineBailouts.cpp +++ b/js/src/jit/BaselineBailouts.cpp @@ -1654,7 +1654,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo *bailoutInfo) // (which must be a baseline frame), and set it as the last profiling // frame. if (cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime())) - cx->mainThread().jitActivation->setLastProfilingFrame(iter.prevFp()); + cx->runtime()->jitActivation->setLastProfilingFrame(iter.prevFp()); uint32_t frameno = 0; while (frameno < numFrames) { @@ -1707,7 +1707,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo *bailoutInfo) // values into the baseline frame. We need to do this even when debug mode // is off, as we should respect the mutations made while debug mode was // on. - JitActivation *act = cx->mainThread().activation()->asJit(); + JitActivation *act = cx->runtime()->activation()->asJit(); if (act->hasRematerializedFrame(outerFp)) { JitFrameIterator iter(cx); size_t inlineDepth = numFrames; @@ -1754,6 +1754,8 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo *bailoutInfo) case Bailout_NonObjectInput: case Bailout_NonStringInput: case Bailout_NonSymbolInput: + case Bailout_NonSimdInt32x4Input: + case Bailout_NonSimdFloat32x4Input: case Bailout_InitialState: case Bailout_Debugger: // Do nothing. diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index 18997cad903f..5fdee55306a4 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -512,7 +512,7 @@ bool BaselineCompiler::emitStackCheck(bool earlyCheck) { Label skipCall; - void *limitAddr = cx->runtime()->mainThread.addressOfJitStackLimit(); + void *limitAddr = cx->runtime()->addressOfJitStackLimit(); uint32_t slotsSize = script->nslots() * sizeof(Value); uint32_t tolerance = earlyCheck ? slotsSize : 0; @@ -3644,7 +3644,7 @@ BaselineCompiler::emit_JSOP_RESUME() Label skip; AbsoluteAddress addressOfEnabled(cx->runtime()->spsProfiler.addressOfEnabled()); masm.branch32(Assembler::Equal, addressOfEnabled, Imm32(0), &skip); - masm.loadPtr(AbsoluteAddress(cx->mainThread().addressOfProfilingActivation()), scratchReg); + masm.loadPtr(AbsoluteAddress(cx->runtime()->addressOfProfilingActivation()), scratchReg); masm.storePtr(BaselineStackReg, Address(scratchReg, JitActivation::offsetOfLastProfilingFrame())); masm.bind(&skip); diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 533c1caabb8d..1b7cb82a181b 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -14,6 +14,7 @@ #include "jstypes.h" #include "builtin/Eval.h" +#include "builtin/SIMD.h" #include "jit/BaselineDebugModeOSR.h" #include "jit/BaselineHelpers.h" #include "jit/BaselineJIT.h" @@ -1013,7 +1014,7 @@ ICWarmUpCounter_Fallback::Compiler::generateStubCode(MacroAssembler &masm) Label checkOk; AbsoluteAddress addressOfEnabled(cx->runtime()->spsProfiler.addressOfEnabled()); masm.branch32(Assembler::Equal, addressOfEnabled, Imm32(0), &checkOk); - masm.loadPtr(AbsoluteAddress((void*)&cx->mainThread().jitActivation), scratchReg); + masm.loadPtr(AbsoluteAddress((void*)&cx->runtime()->jitActivation), scratchReg); masm.loadPtr(Address(scratchReg, JitActivation::offsetOfLastProfilingFrame()), scratchReg); // It may be the case that we entered the baseline frame with @@ -8840,7 +8841,7 @@ TryAttachFunCallStub(JSContext *cx, ICCall_Fallback *stub, HandleScript script, static bool GetTemplateObjectForNative(JSContext *cx, HandleScript script, jsbytecode *pc, - Native native, const CallArgs &args, MutableHandleNativeObject res) + Native native, const CallArgs &args, MutableHandleObject res) { // Check for natives to which template objects can be attached. This is // done to provide templates to Ion for inlining these natives later on. @@ -8917,6 +8918,14 @@ GetTemplateObjectForNative(JSContext *cx, HandleScript script, jsbytecode *pc, return true; } + if (native == js::simd_int32x4_add && JitSupportsSimd()) { + Rooted descr(cx, &Int32x4::GetTypeDescr(*cx->global())); + res.set(TypedObject::createZeroed(cx, descr, 0, gc::TenuredHeap)); + if (!res) + return false; + return true; + } + return true; } @@ -9151,7 +9160,7 @@ TryAttachCallStub(JSContext *cx, ICCall_Fallback *stub, HandleScript script, jsb return true; } - RootedNativeObject templateObject(cx); + RootedObject templateObject(cx); if (MOZ_LIKELY(!isSpread)) { CallArgs args = CallArgsFromVp(argc, vp); if (!GetTemplateObjectForNative(cx, script, pc, fun->native(), args, &templateObject)) @@ -11741,7 +11750,7 @@ ICCall_AnyScripted::Clone(JSContext *, ICStubSpace *space, ICStub *firstMonitorS } ICCall_Native::ICCall_Native(JitCode *stubCode, ICStub *firstMonitorStub, - HandleFunction callee, HandleNativeObject templateObject, + HandleFunction callee, HandleObject templateObject, uint32_t pcOffset) : ICMonitoredStub(ICStub::Call_Native, stubCode, firstMonitorStub), callee_(callee), @@ -11762,7 +11771,7 @@ ICCall_Native::Clone(JSContext *cx, ICStubSpace *space, ICStub *firstMonitorStub ICCall_Native &other) { RootedFunction callee(cx, other.callee_); - RootedNativeObject templateObject(cx, other.templateObject_); + RootedObject templateObject(cx, other.templateObject_); return New(space, other.jitCode(), firstMonitorStub, callee, templateObject, other.pcOffset_); } diff --git a/js/src/jit/BaselineIC.h b/js/src/jit/BaselineIC.h index 5a85c5ec8bd8..e84ddd86550a 100644 --- a/js/src/jit/BaselineIC.h +++ b/js/src/jit/BaselineIC.h @@ -5921,7 +5921,7 @@ class ICCall_Native : public ICMonitoredStub protected: HeapPtrFunction callee_; - HeapPtrNativeObject templateObject_; + HeapPtrObject templateObject_; uint32_t pcOffset_; #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) @@ -5929,12 +5929,12 @@ class ICCall_Native : public ICMonitoredStub #endif ICCall_Native(JitCode *stubCode, ICStub *firstMonitorStub, - HandleFunction callee, HandleNativeObject templateObject, + HandleFunction callee, HandleObject templateObject, uint32_t pcOffset); public: static inline ICCall_Native *New(ICStubSpace *space, JitCode *code, ICStub *firstMonitorStub, - HandleFunction callee, HandleNativeObject templateObject, + HandleFunction callee, HandleObject templateObject, uint32_t pcOffset) { if (!code) @@ -5949,7 +5949,7 @@ class ICCall_Native : public ICMonitoredStub HeapPtrFunction &callee() { return callee_; } - HeapPtrNativeObject &templateObject() { + HeapPtrObject &templateObject() { return templateObject_; } @@ -5973,7 +5973,7 @@ class ICCall_Native : public ICMonitoredStub bool isConstructing_; bool isSpread_; RootedFunction callee_; - RootedNativeObject templateObject_; + RootedObject templateObject_; uint32_t pcOffset_; bool generateStubCode(MacroAssembler &masm); @@ -5984,7 +5984,7 @@ class ICCall_Native : public ICMonitoredStub public: Compiler(JSContext *cx, ICStub *firstMonitorStub, - HandleFunction callee, HandleNativeObject templateObject, + HandleFunction callee, HandleObject templateObject, bool isConstructing, bool isSpread, uint32_t pcOffset) : ICCallStubCompiler(cx, ICStub::Call_Native), firstMonitorStub_(firstMonitorStub), diff --git a/js/src/jit/BaselineInspector.cpp b/js/src/jit/BaselineInspector.cpp index a9541873cea5..c9c38a835ec7 100644 --- a/js/src/jit/BaselineInspector.cpp +++ b/js/src/jit/BaselineInspector.cpp @@ -440,7 +440,7 @@ BaselineInspector::getTemplateObject(jsbytecode *pc) return nullptr; } -NativeObject * +JSObject * BaselineInspector::getTemplateObjectForNative(jsbytecode *pc, Native native) { if (!hasBaselineScript()) diff --git a/js/src/jit/BaselineInspector.h b/js/src/jit/BaselineInspector.h index d58dc3ccd701..6c42989e5837 100644 --- a/js/src/jit/BaselineInspector.h +++ b/js/src/jit/BaselineInspector.h @@ -110,7 +110,7 @@ class BaselineInspector bool hasSeenNonStringIterMore(jsbytecode *pc); NativeObject *getTemplateObject(jsbytecode *pc); - NativeObject *getTemplateObjectForNative(jsbytecode *pc, Native native); + JSObject *getTemplateObjectForNative(jsbytecode *pc, Native native); JSObject *getTemplateObjectForClassHook(jsbytecode *pc, const Class *clasp); DeclEnvObject *templateDeclEnvObject(); diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp index f3d685bf6170..3620cf488440 100644 --- a/js/src/jit/CodeGenerator.cpp +++ b/js/src/jit/CodeGenerator.cpp @@ -3075,25 +3075,17 @@ CodeGenerator::visitApplyArgsGeneric(LApplyArgsGeneric *apply) masm.checkStackAlignment(); - // If the function is known to be uncompilable, only emit the call to InvokeFunction. - if (apply->hasSingleTarget()) { - JSFunction *target = apply->getSingleTarget(); - if (target->isNative()) { - emitCallInvokeFunction(apply, copyreg); - emitPopArguments(apply, copyreg); - return; - } + // If the function is native, only emit the call to InvokeFunction. + if (apply->hasSingleTarget() && apply->getSingleTarget()->isNative()) { + emitCallInvokeFunction(apply, copyreg); + emitPopArguments(apply, copyreg); + return; } Label end, invoke; - // Guard that calleereg is an interpreted function with a JSScript: - if (!apply->hasSingleTarget()) { - masm.branchIfFunctionHasNoScript(calleereg, &invoke); - } else { - // Native single targets are handled by LCallNative. - MOZ_ASSERT(!apply->getSingleTarget()->isNative()); - } + // Guard that calleereg is an interpreted function with a JSScript. + masm.branchIfFunctionHasNoScript(calleereg, &invoke); // Knowing that calleereg is a non-native function, load the JSScript. masm.loadPtr(Address(calleereg, JSFunction::offsetOfNativeOrScript()), objreg); @@ -4233,6 +4225,74 @@ CodeGenerator::visitSimdBox(LSimdBox *lir) } } +void +CodeGenerator::visitSimdUnbox(LSimdUnbox *lir) +{ + Register object = ToRegister(lir->input()); + FloatRegister simd = ToFloatRegister(lir->output()); + Register temp = ToRegister(lir->temp()); + Label bail; + + // obj->type() + masm.loadPtr(Address(object, JSObject::offsetOfType()), temp); + + // Guard that the object has the same representation as the one produced for + // SIMD value-type. + Address clasp(temp, types::TypeObject::offsetOfClasp()); + static_assert(!SimdTypeDescr::Opaque, "SIMD objects are transparent"); + masm.branchPtr(Assembler::NotEqual, clasp, ImmPtr(&InlineTransparentTypedObject::class_), + &bail); + + // obj->type()->typeDescr() + // The previous class pointer comparison implies that the addendumKind is + // Addendum_TypeDescr. + masm.loadPtr(Address(temp, types::TypeObject::offsetOfAddendum()), temp); + + // Check for the /Kind/ reserved slot of the TypeDescr. This is an Int32 + // Value which is equivalent to the object class check. + static_assert(JS_DESCR_SLOT_KIND < NativeObject::MAX_FIXED_SLOTS, "Load from fixed slots"); + Address typeDescrKind(temp, NativeObject::getFixedSlotOffset(JS_DESCR_SLOT_KIND)); + masm.assertTestInt32(Assembler::Equal, typeDescrKind, + "MOZ_ASSERT(obj->type()->typeDescr()->getReservedSlot(JS_DESCR_SLOT_KIND).isInt32())"); + masm.branch32(Assembler::NotEqual, masm.ToPayload(typeDescrKind), Imm32(js::type::Simd), &bail); + + // Convert the SIMD MIRType to a SimdTypeDescr::Type. + js::SimdTypeDescr::Type type; + switch (lir->mir()->type()) { + case MIRType_Int32x4: + type = js::SimdTypeDescr::TYPE_INT32; + break; + case MIRType_Float32x4: + type = js::SimdTypeDescr::TYPE_FLOAT32; + break; + default: + MOZ_CRASH("Unexpected SIMD Type."); + } + + // Check if the SimdTypeDescr /Type/ match the specialization of this + // MSimdUnbox instruction. + static_assert(JS_DESCR_SLOT_TYPE < NativeObject::MAX_FIXED_SLOTS, "Load from fixed slots"); + Address typeDescrType(temp, NativeObject::getFixedSlotOffset(JS_DESCR_SLOT_TYPE)); + masm.assertTestInt32(Assembler::Equal, typeDescrType, + "MOZ_ASSERT(obj->type()->typeDescr()->getReservedSlot(JS_DESCR_SLOT_TYPE).isInt32())"); + masm.branch32(Assembler::NotEqual, masm.ToPayload(typeDescrType), Imm32(type), &bail); + + // Load the value from the data of the InlineTypedObject. + Address objectData(object, InlineTypedObject::offsetOfDataStart()); + switch (lir->mir()->type()) { + case MIRType_Int32x4: + masm.loadUnalignedInt32x4(objectData, simd); + break; + case MIRType_Float32x4: + masm.loadUnalignedFloat32x4(objectData, simd); + break; + default: + MOZ_CRASH("The impossible happened!"); + } + + bailoutFrom(&bail, lir->snapshot()); +} + typedef js::DeclEnvObject *(*NewDeclEnvObjectFn)(JSContext *, HandleFunction, gc::InitialHeap); static const VMFunction NewDeclEnvObjectInfo = FunctionInfo(DeclEnvObject::createTemplateObject); diff --git a/js/src/jit/CodeGenerator.h b/js/src/jit/CodeGenerator.h index 60dacf547459..5c5824a32cc5 100644 --- a/js/src/jit/CodeGenerator.h +++ b/js/src/jit/CodeGenerator.h @@ -156,6 +156,7 @@ class CodeGenerator : public CodeGeneratorSpecific void visitOutOfLineNewObject(OutOfLineNewObject *ool); void visitNewTypedObject(LNewTypedObject *lir); void visitSimdBox(LSimdBox *lir); + void visitSimdUnbox(LSimdUnbox *lir); void visitNewDeclEnvObject(LNewDeclEnvObject *lir); void visitNewCallObject(LNewCallObject *lir); void visitNewSingletonCallObject(LNewSingletonCallObject *lir); diff --git a/js/src/jit/CompileWrappers.cpp b/js/src/jit/CompileWrappers.cpp index 79613533b8b7..8d83468527ba 100644 --- a/js/src/jit/CompileWrappers.cpp +++ b/js/src/jit/CompileWrappers.cpp @@ -37,37 +37,37 @@ CompileRuntime::mainThread() const void * CompileRuntime::addressOfJitTop() { - return &runtime()->mainThread.jitTop; + return &runtime()->jitTop; } const void * CompileRuntime::addressOfJitActivation() { - return &runtime()->mainThread.jitActivation; + return &runtime()->jitActivation; } const void * CompileRuntime::addressOfProfilingActivation() { - return (const void *) &runtime()->mainThread.profilingActivation_; + return (const void *) &runtime()->profilingActivation_; } const void * CompileRuntime::addressOfJitStackLimit() { - return runtime()->mainThread.addressOfJitStackLimit(); + return runtime()->addressOfJitStackLimit(); } const void * CompileRuntime::addressOfJSContext() { - return &runtime()->mainThread.jitJSContext; + return &runtime()->jitJSContext; } const void * CompileRuntime::addressOfActivation() { - return runtime()->mainThread.addressOfActivation(); + return runtime()->addressOfActivation(); } const void * diff --git a/js/src/jit/CompileWrappers.h b/js/src/jit/CompileWrappers.h index ef443327035c..681f400fbb1a 100644 --- a/js/src/jit/CompileWrappers.h +++ b/js/src/jit/CompileWrappers.h @@ -31,22 +31,22 @@ class CompileRuntime js::PerThreadData *mainThread(); - // &mainThread.jitTop + // &runtime()->jitTop const void *addressOfJitTop(); - // &mainThread.jitActivation + // &runtime()->jitActivation const void *addressOfJitActivation(); - // &mainThread.profilingActivation + // &runtime()->profilingActivation const void *addressOfProfilingActivation(); - // rt->mainThread.jitStackLimit; + // rt->runtime()->jitStackLimit; const void *addressOfJitStackLimit(); - // &mainThread.jitJSContext + // &runtime()->jitJSContext const void *addressOfJSContext(); - // &mainThread.activation_ + // &runtime()->activation_ const void *addressOfActivation(); // &GetJitContext()->runtime->nativeIterCache.last diff --git a/js/src/jit/IonBuilder.h b/js/src/jit/IonBuilder.h index e86fc5997b75..28bbb0b2084f 100644 --- a/js/src/jit/IonBuilder.h +++ b/js/src/jit/IonBuilder.h @@ -788,7 +788,11 @@ class IonBuilder bool elementAccessIsTypedObjectArrayOfScalarType(MDefinition* obj, MDefinition* id, ScalarTypeDescr::Type *arrayType); InliningStatus inlineConstructTypedObject(CallInfo &callInfo, TypeDescr *target); + + // SIMD intrinsics and natives. InliningStatus inlineConstructSimdObject(CallInfo &callInfo, SimdTypeDescr *target); + InliningStatus inlineSimdInt32x4BinaryArith(CallInfo &callInfo, JSNative native, + MSimdBinaryArith::Operation op); // Utility intrinsics. InliningStatus inlineIsCallable(CallInfo &callInfo); diff --git a/js/src/jit/IonTypes.h b/js/src/jit/IonTypes.h index aa71c713b1f9..74c62749bc16 100644 --- a/js/src/jit/IonTypes.h +++ b/js/src/jit/IonTypes.h @@ -100,6 +100,10 @@ enum BailoutKind Bailout_NonStringInput, Bailout_NonSymbolInput, + // SIMD Unbox expects a given type, bails out if it doesn't match. + Bailout_NonSimdInt32x4Input, + Bailout_NonSimdFloat32x4Input, + // For the initial snapshot when entering a function. Bailout_InitialState, @@ -193,6 +197,10 @@ BailoutKindString(BailoutKind kind) return "Bailout_NonStringInput"; case Bailout_NonSymbolInput: return "Bailout_NonSymbolInput"; + case Bailout_NonSimdInt32x4Input: + return "Bailout_NonSimdInt32x4Input"; + case Bailout_NonSimdFloat32x4Input: + return "Bailout_NonSimdFloat32x4Input"; case Bailout_InitialState: return "Bailout_InitialState"; case Bailout_Debugger: diff --git a/js/src/jit/JitFrameIterator.h b/js/src/jit/JitFrameIterator.h index cc8b691061bc..ebc6ff97e9fd 100644 --- a/js/src/jit/JitFrameIterator.h +++ b/js/src/jit/JitFrameIterator.h @@ -89,8 +89,9 @@ class BaselineFrame; class JitActivation; // Iterate over the JIT stack to assert that all invariants are respected. -// - Check that all entry frames are aligned on StackAlignment. -void AssertValidJitStack(JSContext *cx); +// - Check that all entry frames are aligned on JitStackAlignment. +// - Check that all rectifier frames keep the JitStackAlignment. +void AssertJitStackInvariants(JSContext *cx); class JitFrameIterator { diff --git a/js/src/jit/JitFrames.cpp b/js/src/jit/JitFrames.cpp index dc587fa732b8..3921624b5c9a 100644 --- a/js/src/jit/JitFrames.cpp +++ b/js/src/jit/JitFrames.cpp @@ -98,12 +98,12 @@ JitFrameIterator::JitFrameIterator() } JitFrameIterator::JitFrameIterator(JSContext *cx) - : current_(cx->perThreadData->jitTop), + : current_(cx->runtime()->jitTop), type_(JitFrame_Exit), returnAddressToFp_(nullptr), frameSize_(0), cachedSafepointIndex_(nullptr), - activation_(cx->perThreadData->activation()->asJit()) + activation_(cx->runtime()->activation()->asJit()) { if (activation_->bailoutData()) { current_ = activation_->bailoutData()->fp(); @@ -390,7 +390,7 @@ HandleExceptionIon(JSContext *cx, const InlineFrameIterator &frame, ResumeFromEx // Debugger has observed this frame (e.g., for onPop). bool shouldBail = Debugger::hasLiveHook(cx->global(), Debugger::OnExceptionUnwind); if (!shouldBail) { - JitActivation *act = cx->mainThread().activation()->asJit(); + JitActivation *act = cx->runtime()->activation()->asJit(); RematerializedFrame *rematFrame = act->lookupRematerializedFrame(frame.frame().fp(), frame.frameNo()); shouldBail = rematFrame && rematFrame->isDebuggee(); @@ -693,10 +693,10 @@ struct AutoResetLastProfilerFrameOnReturnFromException if (!cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime())) return; - MOZ_ASSERT(cx->mainThread().jitActivation == cx->mainThread().profilingActivation()); + MOZ_ASSERT(cx->runtime()->jitActivation == cx->runtime()->profilingActivation()); void *lastProfilingFrame = getLastProfilingFrame(); - cx->mainThread().jitActivation->setLastProfilingFrame(lastProfilingFrame); + cx->runtime()->jitActivation->setLastProfilingFrame(lastProfilingFrame); } void *getLastProfilingFrame() { @@ -740,7 +740,7 @@ HandleException(ResumeFromException *rfe) if (cx->runtime()->jitRuntime()->hasIonReturnOverride()) cx->runtime()->jitRuntime()->takeIonReturnOverride(); - JitActivation *activation = cx->mainThread().activation()->asJit(); + JitActivation *activation = cx->runtime()->activation()->asJit(); // The Debugger onExceptionUnwind hook (reachable via // HandleExceptionBaseline below) may cause on-stack recompilation of @@ -863,7 +863,7 @@ HandleException(ResumeFromException *rfe) // not crash when accessing an IonScript that's destroyed by the // ionScript->decref call. EnsureExitFrame(current); - cx->mainThread().jitTop = (uint8_t *)current; + cx->runtime()->jitTop = (uint8_t *)current; } if (overrecursed) { @@ -2737,16 +2737,16 @@ JitProfilingFrameIterator::JitProfilingFrameIterator( { // If no profilingActivation is live, initialize directly to // end-of-iteration state. - if (!rt->mainThread.profilingActivation()) { + if (!rt->profilingActivation()) { type_ = JitFrame_Entry; fp_ = nullptr; returnAddressToFp_ = nullptr; return; } - MOZ_ASSERT(rt->mainThread.profilingActivation()->isJit()); + MOZ_ASSERT(rt->profilingActivation()->isJit()); - JitActivation *act = rt->mainThread.profilingActivation()->asJit(); + JitActivation *act = rt->profilingActivation()->asJit(); // If the top JitActivation has a null lastProfilingFrame, assume that // it's a trivially empty activation, and initialize directly @@ -3026,12 +3026,30 @@ InvalidationBailoutStack::checkInvariants() const } void -AssertValidJitStack(JSContext *cx) +AssertJitStackInvariants(JSContext *cx) { for (JitActivationIterator activations(cx->runtime()); !activations.done(); ++activations) { JitFrameIterator frames(activations); - for (; !frames.done(); ++frames) - continue; + for (; !frames.done(); ++frames) { + + if (frames.prevType() == JitFrame_Rectifier) { + size_t calleeFp = reinterpret_cast(frames.fp()); + size_t callerFp = reinterpret_cast(frames.prevFp()); + MOZ_ASSERT(callerFp >= calleeFp); + size_t frameSize = callerFp - calleeFp; + + MOZ_RELEASE_ASSERT(frameSize % JitStackAlignment == 0, + "The rectifier frame should keep the alignment"); + + size_t expectedFrameSize = 0 + + sizeof(Value) * (frames.callee()->nargs() + 1 /* |this| argument */ ) + + sizeof(JitFrameLayout); + MOZ_RELEASE_ASSERT(frameSize >= expectedFrameSize, + "The frame is large enough to hold all arguments"); + MOZ_RELEASE_ASSERT(expectedFrameSize + JitStackAlignment > frameSize, + "The frame size is optimal"); + } + } MOZ_RELEASE_ASSERT(frames.type() == JitFrame_Entry, "The first frame of a Jit activation should be an entry frame"); diff --git a/js/src/jit/LIR-Common.h b/js/src/jit/LIR-Common.h index d58c97dac0f7..a0eae739cd05 100644 --- a/js/src/jit/LIR-Common.h +++ b/js/src/jit/LIR-Common.h @@ -157,6 +157,26 @@ class LSimdBox : public LInstructionHelper<1, 1, 1> } }; +class LSimdUnbox : public LInstructionHelper<1, 1, 1> +{ + public: + LIR_HEADER(SimdUnbox) + + LSimdUnbox(const LAllocation &obj, const LDefinition &temp) + { + setOperand(0, obj); + setTemp(0, temp); + } + + const LDefinition *temp() { + return getTemp(0); + } + + MSimdUnbox *mir() const { + return mir_->toSimdUnbox(); + } +}; + // Constructs a SIMD value with 4 equal components (e.g. int32x4, float32x4). class LSimdSplatX4 : public LInstructionHelper<1, 1, 0> { diff --git a/js/src/jit/LIR.h b/js/src/jit/LIR.h index 7d00a8a13346..318d9c513691 100644 --- a/js/src/jit/LIR.h +++ b/js/src/jit/LIR.h @@ -67,7 +67,6 @@ class LAllocation : public TempObject protected: static const uintptr_t DATA_BITS = (sizeof(uint32_t) * 8) - KIND_BITS; static const uintptr_t DATA_SHIFT = KIND_SHIFT + KIND_BITS; - static const uintptr_t DATA_MASK = (1 << DATA_BITS) - 1; public: enum Kind { @@ -80,6 +79,8 @@ class LAllocation : public TempObject ARGUMENT_SLOT // Argument slot. }; + static const uintptr_t DATA_MASK = (1 << DATA_BITS) - 1; + protected: uint32_t data() const { return uint32_t(bits_) >> DATA_SHIFT; diff --git a/js/src/jit/LOpcodes.h b/js/src/jit/LOpcodes.h index 6df9f485a41b..916fa64f04bd 100644 --- a/js/src/jit/LOpcodes.h +++ b/js/src/jit/LOpcodes.h @@ -18,6 +18,7 @@ _(Double) \ _(Float32) \ _(SimdBox) \ + _(SimdUnbox) \ _(SimdSplatX4) \ _(Int32x4) \ _(Float32x4) \ diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index d647f4d75cbb..5f276c119699 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -3734,6 +3734,30 @@ LIRGenerator::visitSimdBox(MSimdBox *ins) define(lir, ins); } +void +LIRGenerator::visitSimdUnbox(MSimdUnbox *ins) +{ + MOZ_ASSERT(ins->input()->type() == MIRType_Object); + MOZ_ASSERT(IsSimdType(ins->type())); + LUse in = useRegister(ins->input()); + + BailoutKind kind; + switch (ins->type()) { + case MIRType_Int32x4: + kind = Bailout_NonSimdInt32x4Input; + break; + case MIRType_Float32x4: + kind = Bailout_NonSimdFloat32x4Input; + break; + default: + MOZ_CRASH("Unexpected SIMD Type."); + }; + + LSimdUnbox *lir = new(alloc()) LSimdUnbox(in, temp()); + assignSnapshot(lir, kind); + define(lir, ins); +} + void LIRGenerator::visitSimdConstant(MSimdConstant *ins) { diff --git a/js/src/jit/Lowering.h b/js/src/jit/Lowering.h index 69f8ed575328..8eb8f588de63 100644 --- a/js/src/jit/Lowering.h +++ b/js/src/jit/Lowering.h @@ -266,6 +266,7 @@ class LIRGenerator : public LIRGeneratorSpecific void visitRecompileCheck(MRecompileCheck *ins); void visitMemoryBarrier(MMemoryBarrier *ins); void visitSimdBox(MSimdBox *ins); + void visitSimdUnbox(MSimdUnbox *ins); void visitSimdExtractElement(MSimdExtractElement *ins); void visitSimdInsertElement(MSimdInsertElement *ins); void visitSimdSignMask(MSimdSignMask *ins); diff --git a/js/src/jit/MCallOptimize.cpp b/js/src/jit/MCallOptimize.cpp index 6b961e84df01..529f5e2e05ad 100644 --- a/js/src/jit/MCallOptimize.cpp +++ b/js/src/jit/MCallOptimize.cpp @@ -7,6 +7,7 @@ #include "jsmath.h" #include "builtin/AtomicsObject.h" +#include "builtin/SIMD.h" #include "builtin/TestingFunctions.h" #include "builtin/TypedObject.h" #include "jit/BaselineInspector.h" @@ -246,6 +247,10 @@ IonBuilder::inlineNativeCall(CallInfo &callInfo, JSFunction *target) if (native == js::CallOrConstructBoundFunction) return inlineBoundFunction(callInfo, target); + // Simd functions + if (native == js::simd_int32x4_add) + return inlineSimdInt32x4BinaryArith(callInfo, native, MSimdBinaryArith::Add); + return InliningStatus_NotInlined; } @@ -349,17 +354,17 @@ IonBuilder::inlineArray(CallInfo &callInfo) uint32_t initLength = 0; AllocatingBehaviour allocating = NewArray_Unallocating; - NativeObject *templateObject = inspector->getTemplateObjectForNative(pc, js_Array); + JSObject *templateObject = inspector->getTemplateObjectForNative(pc, js_Array); if (!templateObject) return InliningStatus_NotInlined; - MOZ_ASSERT(templateObject->is()); + ArrayObject *templateArray = &templateObject->as(); // Multiple arguments imply array initialization, not just construction. if (callInfo.argc() >= 2) { initLength = callInfo.argc(); allocating = NewArray_FullyAllocating; - types::TypeObjectKey *type = types::TypeObjectKey::get(templateObject); + types::TypeObjectKey *type = types::TypeObjectKey::get(templateArray); if (!type->unknownProperties()) { types::HeapTypeSetKey elemTypes = type->property(JSID_VOID); @@ -376,9 +381,9 @@ IonBuilder::inlineArray(CallInfo &callInfo) types::TemporaryTypeSet::DoubleConversion conversion = getInlineReturnTypeSet()->convertDoubleElements(constraints()); if (conversion == types::TemporaryTypeSet::AlwaysConvertToDoubles) - templateObject->setShouldConvertDoubleElements(); + templateArray->setShouldConvertDoubleElements(); else - templateObject->clearShouldConvertDoubleElements(); + templateArray->clearShouldConvertDoubleElements(); // A single integer argument denotes initial length. if (callInfo.argc() == 1) { @@ -388,7 +393,6 @@ IonBuilder::inlineArray(CallInfo &callInfo) MDefinition *arg = callInfo.getArg(0); if (!arg->isConstantValue()) { callInfo.setImplicitlyUsedUnchecked(); - ArrayObject *templateArray = &templateObject->as(); MNewArrayDynamicLength *ins = MNewArrayDynamicLength::New(alloc(), constraints(), templateArray, templateArray->type()->initialHeap(constraints()), @@ -406,7 +410,7 @@ IonBuilder::inlineArray(CallInfo &callInfo) // Make sure initLength matches the template object's length. This is // not guaranteed to be the case, for instance if we're inlining the // MConstant may come from an outer script. - if (initLength != templateObject->as().length()) + if (initLength != templateArray->as().length()) return InliningStatus_NotInlined; // Don't inline large allocations. @@ -418,11 +422,11 @@ IonBuilder::inlineArray(CallInfo &callInfo) callInfo.setImplicitlyUsedUnchecked(); - MConstant *templateConst = MConstant::NewConstraintlessObject(alloc(), templateObject); + MConstant *templateConst = MConstant::NewConstraintlessObject(alloc(), templateArray); current->add(templateConst); MNewArray *ins = MNewArray::New(alloc(), constraints(), initLength, templateConst, - templateObject->type()->initialHeap(constraints()), + templateArray->type()->initialHeap(constraints()), allocating); current->add(ins); current->push(ins); @@ -730,7 +734,7 @@ IonBuilder::inlineArrayConcat(CallInfo &callInfo) } // Inline the call. - NativeObject *templateObj = inspector->getTemplateObjectForNative(pc, js::array_concat); + JSObject *templateObj = inspector->getTemplateObjectForNative(pc, js::array_concat); if (!templateObj || templateObj->type() != baseThisType) return InliningStatus_NotInlined; MOZ_ASSERT(templateObj->is()); @@ -1611,7 +1615,7 @@ IonBuilder::inlineObjectCreate(CallInfo &callInfo) if (callInfo.argc() != 1 || callInfo.constructing()) return InliningStatus_NotInlined; - NativeObject *templateObject = inspector->getTemplateObjectForNative(pc, obj_create); + JSObject *templateObject = inspector->getTemplateObjectForNative(pc, obj_create); if (!templateObject) return InliningStatus_NotInlined; @@ -2613,5 +2617,37 @@ IonBuilder::inlineConstructSimdObject(CallInfo &callInfo, SimdTypeDescr *descr) return InliningStatus_Inlined; } +IonBuilder::InliningStatus +IonBuilder::inlineSimdInt32x4BinaryArith(CallInfo &callInfo, JSNative native, + MSimdBinaryArith::Operation op) +{ + if (callInfo.argc() != 2) + return InliningStatus_NotInlined; + + JSObject *templateObject = inspector->getTemplateObjectForNative(pc, native); + if (!templateObject) + return InliningStatus_NotInlined; + + InlineTypedObject *inlineTypedObject = &templateObject->as(); + MOZ_ASSERT(inlineTypedObject->typeDescr().as().type() == js::Int32x4::type); + + // If the type of any of the arguments is neither a SIMD type, an Object + // type, or a Value, then the applyTypes phase will add a fallible box & + // unbox sequence. This does not matter much as the binary arithmetic + // instruction is supposed to produce a TypeError once it is called. + MSimdBinaryArith *ins = MSimdBinaryArith::New(alloc(), callInfo.getArg(0), callInfo.getArg(1), + op, MIRType_Int32x4); + + MSimdBox *obj = MSimdBox::New(alloc(), constraints(), ins, inlineTypedObject, + inlineTypedObject->type()->initialHeap(constraints())); + + current->add(ins); + current->add(obj); + current->push(obj); + + callInfo.setImplicitlyUsedUnchecked(); + return InliningStatus_Inlined; +} + } // namespace jit } // namespace js diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index a88172b288f1..8d64878d13e2 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -1922,7 +1922,7 @@ class MSimdBinaryComp class MSimdBinaryArith : public MBinaryInstruction, - public NoTypePolicy::Data + public MixPolicy, SimdSameAsReturnedTypePolicy<1> >::Data { public: enum Operation { @@ -1958,8 +1958,6 @@ class MSimdBinaryArith { MOZ_ASSERT_IF(type == MIRType_Int32x4, op == Add || op == Sub || op == Mul); MOZ_ASSERT(IsSimdType(type)); - MOZ_ASSERT(left->type() == right->type()); - MOZ_ASSERT(left->type() == type); setResultType(type); setMovable(); if (op == Add || op == Mul || op == Min || op == Max) @@ -1968,10 +1966,18 @@ class MSimdBinaryArith public: INSTRUCTION_HEADER(SimdBinaryArith) + static MSimdBinaryArith *New(TempAllocator &alloc, MDefinition *left, MDefinition *right, + Operation op, MIRType t) + { + return new(alloc) MSimdBinaryArith(left, right, op, t); + } + static MSimdBinaryArith *NewAsmJS(TempAllocator &alloc, MDefinition *left, MDefinition *right, Operation op, MIRType t) { - return new(alloc) MSimdBinaryArith(left, right, op, t); + MOZ_ASSERT(left->type() == right->type()); + MOZ_ASSERT(left->type() == t); + return New(alloc, left, right, op, t); } AliasSet getAliasSet() const MOZ_OVERRIDE { @@ -2984,6 +2990,33 @@ class MSimdBox } }; +class MSimdUnbox + : public MUnaryInstruction, + public SingleObjectPolicy::Data +{ + protected: + MSimdUnbox(MDefinition *op, MIRType type) + : MUnaryInstruction(op) + { + MOZ_ASSERT(IsSimdType(type)); + setMovable(); + setResultType(type); + } + + public: + INSTRUCTION_HEADER(SimdUnbox) + ALLOW_CLONE(MSimdUnbox) + + static MSimdUnbox *New(TempAllocator &alloc, MDefinition *op, MIRType type) + { + return new(alloc) MSimdUnbox(op, type); + } + + AliasSet getAliasSet() const MOZ_OVERRIDE { + return AliasSet::None(); + } +}; + // Creates a new derived type object. At runtime, this is just a call // to `BinaryBlock::createDerived()`. That is, the MIR itself does not // compile to particularly optimized code. However, using a distinct diff --git a/js/src/jit/MOpcodes.h b/js/src/jit/MOpcodes.h index 3b8c18d278c6..789908f5ea8d 100644 --- a/js/src/jit/MOpcodes.h +++ b/js/src/jit/MOpcodes.h @@ -13,6 +13,7 @@ namespace jit { #define MIR_OPCODE_LIST(_) \ _(Constant) \ _(SimdBox) \ + _(SimdUnbox) \ _(SimdValueX4) \ _(SimdSplatX4) \ _(SimdConstant) \ diff --git a/js/src/jit/MacroAssembler.cpp b/js/src/jit/MacroAssembler.cpp index da4ba853bebd..4e0718df9f50 100644 --- a/js/src/jit/MacroAssembler.cpp +++ b/js/src/jit/MacroAssembler.cpp @@ -1356,6 +1356,20 @@ MacroAssembler::assumeUnreachable(const char *output) breakpoint(); } +template +void +MacroAssembler::assertTestInt32(Condition cond, const T &value, const char *output) +{ +#ifdef DEBUG + Label ok; + branchTestInt32(cond, value, &ok); + assumeUnreachable(output); + bind(&ok); +#endif +} + +template void MacroAssembler::assertTestInt32(Condition, const Address &, const char *); + static void Printf0_(const char *output) { // Use stderr instead of stdout because this is only used for debug diff --git a/js/src/jit/MacroAssembler.h b/js/src/jit/MacroAssembler.h index 16fc75324f3b..5b6133724396 100644 --- a/js/src/jit/MacroAssembler.h +++ b/js/src/jit/MacroAssembler.h @@ -976,6 +976,10 @@ class MacroAssembler : public MacroAssemblerSpecific void link(JitCode *code); void assumeUnreachable(const char *output); + + template + void assertTestInt32(Condition cond, const T &value, const char *output); + void printf(const char *output); void printf(const char *output, Register value); diff --git a/js/src/jit/Snapshots.cpp b/js/src/jit/Snapshots.cpp index 4cc97dc609f9..a368170d58fb 100644 --- a/js/src/jit/Snapshots.cpp +++ b/js/src/jit/Snapshots.cpp @@ -19,10 +19,38 @@ using namespace js; using namespace js::jit; +// Encodings: +// [ptr] A fixed-size pointer. +// [vwu] A variable-width unsigned integer. +// [vws] A variable-width signed integer. +// [u8] An 8-bit unsigned integer. +// [u8'] An 8-bit unsigned integer which is potentially extended with packed +// data. +// [u8"] Packed data which is stored and packed in the previous [u8']. +// [vwu*] A list of variable-width unsigned integers. +// [pld] Payload of Recover Value Allocation: +// PAYLOAD_NONE: +// There is no payload. +// +// PAYLOAD_INDEX: +// [vwu] Index, such as the constant pool index. +// +// PAYLOAD_STACK_OFFSET: +// [vws] Stack offset based on the base of the Ion frame. +// +// PAYLOAD_GPR: +// [u8] Code of the general register. +// +// PAYLOAD_FPU: +// [u8] Code of the FPU register. +// +// PAYLOAD_PACKED_TAG: +// [u8"] Bits 5-7: JSValueType is encoded on the low bits of the Mode +// of the RValueAllocation. +// // Snapshot header: // -// [vwu] bits ((n+1)-31]: frame count -// bit n+1: resume after +// [vwu] bits ((n+1)-31]: recover instruction offset // bits [0,n): bailout kind (n = SNAPSHOT_BAILOUTKIND_BITS) // // Snapshot body, repeated "frame count" times, from oldest frame to newest frame. @@ -92,35 +120,6 @@ using namespace js::jit; // Value with statically known type, which payload is stored at an // offset on the stack. // -// Encodings: -// [ptr] A fixed-size pointer. -// [vwu] A variable-width unsigned integer. -// [vws] A variable-width signed integer. -// [u8] An 8-bit unsigned integer. -// [u8'] An 8-bit unsigned integer which is potentially extended with packed -// data. -// [u8"] Packed data which is stored and packed in the previous [u8']. -// [vwu*] A list of variable-width unsigned integers. -// [pld] Payload of Recover Value Allocation: -// PAYLOAD_NONE: -// There is no payload. -// -// PAYLOAD_INDEX: -// [vwu] Index, such as the constant pool index. -// -// PAYLOAD_STACK_OFFSET: -// [vws] Stack offset based on the base of the Ion frame. -// -// PAYLOAD_GPR: -// [u8] Code of the general register. -// -// PAYLOAD_FPU: -// [u8] Code of the FPU register. -// -// PAYLOAD_PACKED_TAG: -// [u8"] Bits 5-7: JSValueType is encoded on the low bits of the Mode -// of the RValueAllocation. -// const RValueAllocation::Layout & RValueAllocation::layoutFromMode(Mode mode) @@ -498,7 +497,7 @@ SnapshotReader::SnapshotReader(const uint8_t *snapshots, uint32_t offset, // Details of snapshot header packing. static const uint32_t SNAPSHOT_BAILOUTKIND_SHIFT = 0; -static const uint32_t SNAPSHOT_BAILOUTKIND_BITS = 5; +static const uint32_t SNAPSHOT_BAILOUTKIND_BITS = 6; static const uint32_t SNAPSHOT_BAILOUTKIND_MASK = COMPUTE_MASK_(SNAPSHOT_BAILOUTKIND); static const uint32_t SNAPSHOT_ROFFSET_SHIFT = COMPUTE_SHIFT_AFTER_(SNAPSHOT_BAILOUTKIND); diff --git a/js/src/jit/StackSlotAllocator.h b/js/src/jit/StackSlotAllocator.h index cce61ae05e07..322c3f0f80ed 100644 --- a/js/src/jit/StackSlotAllocator.h +++ b/js/src/jit/StackSlotAllocator.h @@ -75,7 +75,7 @@ class StackSlotAllocator StackSlotAllocator() : height_(0) { } - void freeSlot(LDefinition::Type type, uint32_t index) { + static uint32_t width(LDefinition::Type type) { switch (type) { #if JS_BITS_PER_WORD == 32 case LDefinition::GENERAL: @@ -83,7 +83,7 @@ class StackSlotAllocator case LDefinition::SLOTS: #endif case LDefinition::INT32: - case LDefinition::FLOAT32: return freeSlot(index); + case LDefinition::FLOAT32: return 4; #if JS_BITS_PER_WORD == 64 case LDefinition::GENERAL: case LDefinition::OBJECT: @@ -96,39 +96,29 @@ class StackSlotAllocator case LDefinition::TYPE: case LDefinition::PAYLOAD: #endif - case LDefinition::DOUBLE: return freeDoubleSlot(index); + case LDefinition::DOUBLE: return 8; case LDefinition::FLOAT32X4: - case LDefinition::INT32X4: return freeQuadSlot(index); + case LDefinition::INT32X4: return 16; } MOZ_CRASH("Unknown slot type"); } - uint32_t allocateSlot(LDefinition::Type type) { - switch (type) { -#if JS_BITS_PER_WORD == 32 - case LDefinition::GENERAL: - case LDefinition::OBJECT: - case LDefinition::SLOTS: -#endif - case LDefinition::INT32: - case LDefinition::FLOAT32: return allocateSlot(); -#if JS_BITS_PER_WORD == 64 - case LDefinition::GENERAL: - case LDefinition::OBJECT: - case LDefinition::SLOTS: -#endif -#ifdef JS_PUNBOX64 - case LDefinition::BOX: -#endif -#ifdef JS_NUNBOX32 - case LDefinition::TYPE: - case LDefinition::PAYLOAD: -#endif - case LDefinition::DOUBLE: return allocateDoubleSlot(); - case LDefinition::FLOAT32X4: - case LDefinition::INT32X4: return allocateQuadSlot(); + void freeSlot(LDefinition::Type type, uint32_t index) { + switch (width(type)) { + case 4: return freeSlot(index); + case 8: return freeDoubleSlot(index); + case 16: return freeQuadSlot(index); } - MOZ_CRASH("Unknown slot type"); + MOZ_CRASH("Unknown slot width"); + } + + uint32_t allocateSlot(LDefinition::Type type) { + switch (width(type)) { + case 4: return allocateSlot(); + case 8: return allocateDoubleSlot(); + case 16: return allocateQuadSlot(); + } + MOZ_CRASH("Unknown slot width"); } uint32_t stackHeight() const { diff --git a/js/src/jit/TypePolicy.cpp b/js/src/jit/TypePolicy.cpp index 4fc6efd2ff9a..335dc62eff83 100644 --- a/js/src/jit/TypePolicy.cpp +++ b/js/src/jit/TypePolicy.cpp @@ -717,6 +717,29 @@ template bool ObjectPolicy<1>::staticAdjustInputs(TempAllocator &alloc, MInstruc template bool ObjectPolicy<2>::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins); template bool ObjectPolicy<3>::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins); +template +bool +SimdSameAsReturnedTypePolicy::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins) +{ + MIRType type = ins->type(); + MOZ_ASSERT(IsSimdType(type)); + + MDefinition *in = ins->getOperand(Op); + if (in->type() == type) + return true; + + MSimdUnbox *replace = MSimdUnbox::New(alloc, in, type); + ins->block()->insertBefore(ins, replace); + ins->replaceOperand(Op, replace); + + return replace->typePolicy()->adjustInputs(alloc, replace); +} + +template bool +SimdSameAsReturnedTypePolicy<0>::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins); +template bool +SimdSameAsReturnedTypePolicy<1>::staticAdjustInputs(TempAllocator &alloc, MInstruction *ins); + bool CallPolicy::adjustInputs(TempAllocator &alloc, MInstruction *ins) { @@ -1042,6 +1065,7 @@ FilterTypeSetPolicy::adjustInputs(TempAllocator &alloc, MInstruction *ins) _(MixPolicy, StringPolicy<1> >) \ _(MixPolicy, ConvertToStringPolicy<2> >) \ _(MixPolicy, ConvertToStringPolicy<0> >) \ + _(MixPolicy, SimdSameAsReturnedTypePolicy<1> >) \ _(MixPolicy, IntPolicy<1> >) \ _(MixPolicy, StringPolicy<1> >) \ _(NoFloatPolicy<0>) \ diff --git a/js/src/jit/TypePolicy.h b/js/src/jit/TypePolicy.h index 7a9b432e7f91..64a02a26f3c2 100644 --- a/js/src/jit/TypePolicy.h +++ b/js/src/jit/TypePolicy.h @@ -317,6 +317,19 @@ class SimdScalarPolicy MOZ_FINAL : public TypePolicy } }; +// SIMD value-type policy, use the returned type of the instruction to determine +// how to unbox its operand. +template +class SimdSameAsReturnedTypePolicy MOZ_FINAL : public TypePolicy +{ + public: + EMPTY_DATA_; + static bool staticAdjustInputs(TempAllocator &alloc, MInstruction *ins); + virtual bool adjustInputs(TempAllocator &alloc, MInstruction *ins) MOZ_OVERRIDE { + return staticAdjustInputs(alloc, ins); + } +}; + template class BoxPolicy MOZ_FINAL : public TypePolicy { diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index ff3a43f75dec..3f58ba5d9f27 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -777,7 +777,7 @@ DebugEpilogue(JSContext *cx, BaselineFrame *frame, jsbytecode *pc, bool ok) JitFrameLayout *prefix = frame->framePrefix(); EnsureExitFrame(prefix); - cx->mainThread().jitTop = (uint8_t *)prefix; + cx->runtime()->jitTop = (uint8_t *)prefix; return false; } diff --git a/js/src/jit/arm/MacroAssembler-arm.h b/js/src/jit/arm/MacroAssembler-arm.h index 1ee51fcf3ae8..8b136666e6bb 100644 --- a/js/src/jit/arm/MacroAssembler-arm.h +++ b/js/src/jit/arm/MacroAssembler-arm.h @@ -38,6 +38,7 @@ class MacroAssemblerARM : public Assembler // address. Register secondScratchReg_; + public: // Higher level tag testing code. Operand ToPayload(Operand base) { return Operand(Register::FromCode(base.base()), base.disp()); @@ -45,6 +46,8 @@ class MacroAssemblerARM : public Assembler Address ToPayload(Address base) { return ToPayload(Operand(base)).toAddress(); } + + protected: Operand ToType(Operand base) { return Operand(Register::FromCode(base.base()), base.disp() + sizeof(void *)); } diff --git a/js/src/jit/arm/Simulator-arm.cpp b/js/src/jit/arm/Simulator-arm.cpp index 08cb74a91bf4..c68cc10700b6 100644 --- a/js/src/jit/arm/Simulator-arm.cpp +++ b/js/src/jit/arm/Simulator-arm.cpp @@ -4226,7 +4226,7 @@ Simulator::execute() int32_t rpc = resume_pc_; if (MOZ_UNLIKELY(rpc != 0)) { // AsmJS signal handler ran and we have to adjust the pc. - PerThreadData::innermostAsmJSActivation()->setResumePC((void *)get_pc()); + JSRuntime::innermostAsmJSActivation()->setResumePC((void *)get_pc()); set_pc(rpc); resume_pc_ = 0; } @@ -4418,16 +4418,34 @@ Simulator::Current() } // namespace js js::jit::Simulator * -js::PerThreadData::simulator() const +JSRuntime::simulator() const { return simulator_; } +js::jit::Simulator * +js::PerThreadData::simulator() const +{ + return runtime_->simulator(); +} + +void +JSRuntime::setSimulator(js::jit::Simulator *sim) +{ + simulator_ = sim; + simulatorStackLimit_ = sim->stackLimit(); +} + void js::PerThreadData::setSimulator(js::jit::Simulator *sim) { - simulator_ = sim; - simulatorStackLimit_ = sim->stackLimit(); + runtime_->setSimulator(sim); +} + +uintptr_t * +JSRuntime::addressOfSimulatorStackLimit() +{ + return &simulatorStackLimit_; } js::jit::SimulatorRuntime * @@ -4436,12 +4454,6 @@ js::PerThreadData::simulatorRuntime() const return runtime_->simulatorRuntime(); } -uintptr_t * -js::PerThreadData::addressOfSimulatorStackLimit() -{ - return &simulatorStackLimit_; -} - js::jit::SimulatorRuntime * JSRuntime::simulatorRuntime() const { diff --git a/js/src/jit/arm/Simulator-arm.h b/js/src/jit/arm/Simulator-arm.h index 081f8ac68616..a44960fa0a4e 100644 --- a/js/src/jit/arm/Simulator-arm.h +++ b/js/src/jit/arm/Simulator-arm.h @@ -377,7 +377,7 @@ class Simulator #define JS_CHECK_SIMULATOR_RECURSION_WITH_EXTRA(cx, extra, onerror) \ JS_BEGIN_MACRO \ - if (cx->mainThread().simulator()->overRecursedWithExtra(extra)) { \ + if (cx->runtime()->simulator()->overRecursedWithExtra(extra)) { \ js_ReportOverRecursed(cx); \ onerror; \ } \ diff --git a/js/src/jit/mips/MacroAssembler-mips.h b/js/src/jit/mips/MacroAssembler-mips.h index 68243c39b10d..4fa2cec01930 100644 --- a/js/src/jit/mips/MacroAssembler-mips.h +++ b/js/src/jit/mips/MacroAssembler-mips.h @@ -67,12 +67,13 @@ static_assert(1 << defaultShift == sizeof(jsval), "The defaultShift is wrong"); class MacroAssemblerMIPS : public Assembler { - protected: + public: // higher level tag testing code Operand ToPayload(Operand base); Address ToPayload(Address base) { return ToPayload(Operand(base)).toAddress(); } + protected: Operand ToType(Operand base); Address ToType(Address base) { return ToType(Operand(base)).toAddress(); diff --git a/js/src/jit/mips/Simulator-mips.cpp b/js/src/jit/mips/Simulator-mips.cpp index 7099e95e3cbc..b8ebac703cbb 100644 --- a/js/src/jit/mips/Simulator-mips.cpp +++ b/js/src/jit/mips/Simulator-mips.cpp @@ -3312,7 +3312,7 @@ Simulator::execute() // Get the PC to simulate. Cannot use the accessor here as we need the // raw PC value and not the one used as input to arithmetic instructions. int program_counter = get_pc(); - AsmJSActivation *activation = TlsPerThreadData.get()->asmJSActivationStack(); + AsmJSActivation *activation = TlsPerThreadData.get()->runtimeFromMainThread()->asmJSActivationStack(); while (program_counter != end_sim_pc) { if (enableStopSimAt && (icount_ == Simulator::StopSimAt)) { @@ -3470,16 +3470,34 @@ Simulator::popAddress() } // namespace js js::jit::Simulator * -js::PerThreadData::simulator() const +JSRuntime::simulator() const { return simulator_; } +js::jit::Simulator * +js::PerThreadData::simulator() const +{ + return runtime_->simulator(); +} + +void +JSRuntime::setSimulator(js::jit::Simulator *sim) +{ + simulator_ = sim; + simulatorStackLimit_ = sim->stackLimit(); +} + void js::PerThreadData::setSimulator(js::jit::Simulator *sim) { - simulator_ = sim; - simulatorStackLimit_ = sim->stackLimit(); + runtime_->setSimulator(sim); +} + +uintptr_t * +JSRuntime::addressOfSimulatorStackLimit() +{ + return &simulatorStackLimit_; } js::jit::SimulatorRuntime * @@ -3488,12 +3506,6 @@ js::PerThreadData::simulatorRuntime() const return runtime_->simulatorRuntime(); } -uintptr_t * -js::PerThreadData::addressOfSimulatorStackLimit() -{ - return &simulatorStackLimit_; -} - js::jit::SimulatorRuntime * JSRuntime::simulatorRuntime() const { diff --git a/js/src/jit/x64/MacroAssembler-x64.h b/js/src/jit/x64/MacroAssembler-x64.h index d618d69be256..83f1d79f8d49 100644 --- a/js/src/jit/x64/MacroAssembler-x64.h +++ b/js/src/jit/x64/MacroAssembler-x64.h @@ -161,6 +161,10 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared ///////////////////////////////////////////////////////////////// // X86/X64-common interface. ///////////////////////////////////////////////////////////////// + Address ToPayload(Address value) { + return value; + } + void storeValue(ValueOperand val, Operand dest) { movq(val.valueReg(), dest); } diff --git a/js/src/jit/x64/Trampoline-x64.cpp b/js/src/jit/x64/Trampoline-x64.cpp index f0b375baec72..33484dbfdff3 100644 --- a/js/src/jit/x64/Trampoline-x64.cpp +++ b/js/src/jit/x64/Trampoline-x64.cpp @@ -380,18 +380,47 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) // Do not erase the frame pointer in this function. MacroAssembler masm(cx); + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- rsp + // '--- #r8 ---' // ArgumentsRectifierReg contains the |nargs| pushed onto the current frame. // Including |this|, there are (|nargs| + 1) arguments to copy. MOZ_ASSERT(ArgumentsRectifierReg == r8); - // Load the number of |undefined|s to push into %rcx. + // Add |this|, in the counter of known arguments. + masm.addl(Imm32(1), r8); + + // Load |nformals| into %rcx. masm.loadPtr(Address(rsp, RectifierFrameLayout::offsetOfCalleeToken()), rax); masm.mov(rax, rcx); masm.andq(Imm32(uint32_t(CalleeTokenMask)), rcx); masm.movzwl(Operand(rcx, JSFunction::offsetOfNargs()), rcx); + + // Including |this|, there are (|nformals| + 1) arguments to push to the + // stack. Then we push a JitFrameLayout. We compute the padding expressed + // in the number of extra |undefined| values to push on the stack. + static_assert(sizeof(JitFrameLayout) % JitStackAlignment == 0, + "No need to consider the JitFrameLayout for aligning the stack"); + static_assert(JitStackAlignment % sizeof(Value) == 0, + "Ensure that we can pad the stack by pushing extra UndefinedValue"); + + const uint32_t alignment = JitStackAlignment / sizeof(Value); + MOZ_ASSERT(IsPowerOfTwo(alignment)); + masm.addl(Imm32(alignment - 1 /* for padding */ + 1 /* for |this| */), rcx); + masm.andl(Imm32(~(alignment - 1)), rcx); + + // Load the number of |undefined|s to push into %rcx. masm.subq(r8, rcx); + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- rsp <- r9 + // '------ #r8 -------' + // + // Rectifier frame: + // [undef] [undef] [undef] [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] + // '------- #rcx --------' '------ #r8 -------' + // Copy the number of actual arguments masm.loadPtr(Address(rsp, RectifierFrameLayout::offsetOfNumActualArgs()), rdx); @@ -399,7 +428,7 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) masm.movq(rsp, r9); // Save %rsp. - // Push undefined. + // Push undefined. (including the padding) { Label undefLoopTop; masm.bind(&undefLoopTop); @@ -410,11 +439,14 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) } // Get the topmost argument. - BaseIndex b = BaseIndex(r9, r8, TimesEight, sizeof(RectifierFrameLayout)); + static_assert(sizeof(Value) == 8, "TimesEight is used to skip arguments"); + + // | - sizeof(Value)| is used to put rcx such that we can read the last + // argument, and not the value which is after. + BaseIndex b = BaseIndex(r9, r8, TimesEight, sizeof(RectifierFrameLayout) - sizeof(Value)); masm.lea(Operand(b), rcx); - // Push arguments, |nargs| + 1 times (to include |this|). - masm.addl(Imm32(1), r8); + // Copy & Push arguments, |nargs| + 1 times (to include |this|). { Label copyLoopTop; @@ -425,6 +457,14 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) masm.j(Assembler::NonZero, ©LoopTop); } + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- r9 + // + // + // Rectifier frame: + // [undef] [undef] [undef] [arg2] [arg1] [this] <- rsp [[argc] [callee] [descr] [raddr]] + // + // Construct descriptor. masm.subq(rsp, r9); masm.makeFrameDescriptor(r9, JitFrame_Rectifier); diff --git a/js/src/jit/x86/Trampoline-x86.cpp b/js/src/jit/x86/Trampoline-x86.cpp index 598f05e117f7..bfe281e4ea55 100644 --- a/js/src/jit/x86/Trampoline-x86.cpp +++ b/js/src/jit/x86/Trampoline-x86.cpp @@ -370,6 +370,9 @@ JitCode * JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) { MacroAssembler masm(cx); + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] <- esp + // '-- #esi ---' // ArgumentsRectifierReg contains the |nargs| pushed onto the current frame. // Including |this|, there are (|nargs| + 1) arguments to copy. @@ -380,6 +383,22 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) masm.mov(eax, ecx); masm.andl(Imm32(CalleeTokenMask), ecx); masm.movzwl(Operand(ecx, JSFunction::offsetOfNargs()), ecx); + + // The frame pointer and its padding are pushed on the stack. + // Including |this|, there are (|nformals| + 1) arguments to push to the + // stack. Then we push a JitFrameLayout. We compute the padding expressed + // in the number of extra |undefined| values to push on the stack. + static_assert(sizeof(JitFrameLayout) % JitStackAlignment == 0, + "No need to consider the JitFrameLayout for aligning the stack"); + static_assert((sizeof(Value) + 2 * sizeof(void *)) % JitStackAlignment == 0, + "No need to consider |this| and the frame pointer and its padding for aligning the stack"); + static_assert(JitStackAlignment % sizeof(Value) == 0, + "Ensure that we can pad the stack by pushing extra UndefinedValue"); + + const uint32_t alignment = JitStackAlignment / sizeof(Value); + MOZ_ASSERT(IsPowerOfTwo(alignment)); + masm.addl(Imm32(alignment - 1 /* for padding */), ecx); + masm.andl(Imm32(~(alignment - 1)), ecx); masm.subl(esi, ecx); // Copy the number of actual arguments. @@ -393,6 +412,17 @@ JitRuntime::generateArgumentsRectifier(JSContext *cx, void **returnAddrOut) // BaselineJIT.cpp/InitFromBailout. Check for the |#if defined(JS_CODEGEN_X86)| portions. masm.push(FramePointer); masm.movl(esp, FramePointer); // Save %esp. + masm.push(FramePointer /* padding */); + + // Caller: + // [arg2] [arg1] [this] [[argc] [callee] [descr] [raddr]] + // '-- #esi ---' + // + // Rectifier frame: + // [ebp'] <- ebp [padding] <- esp [undef] [undef] [arg2] [arg1] [this] + // '--- #ecx ----' '-- #esi ---' + // + // [[argc] [callee] [descr] [raddr]] // Push undefined. { diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index e0437997d448..9e84ab285a0d 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1732,7 +1732,7 @@ JS_SetNativeStackQuota(JSRuntime *rt, size_t systemCodeStackSize, size_t trusted SetNativeStackQuotaAndLimit(rt, StackForTrustedScript, trustedScriptStackSize); SetNativeStackQuotaAndLimit(rt, StackForUntrustedScript, untrustedScriptStackSize); - rt->mainThread.initJitStackLimit(); + rt->initJitStackLimit(); } /************************************************************************/ @@ -5894,7 +5894,7 @@ HideScriptedCaller(JSContext *cx) // If there's no accessible activation on the stack, we'll return null from // DescribeScriptedCaller anyway, so there's no need to annotate anything. - Activation *act = cx->runtime()->mainThread.activation(); + Activation *act = cx->runtime()->activation(); if (!act) return; act->hideScriptedCaller(); @@ -5903,7 +5903,7 @@ HideScriptedCaller(JSContext *cx) JS_PUBLIC_API(void) UnhideScriptedCaller(JSContext *cx) { - Activation *act = cx->runtime()->mainThread.activation(); + Activation *act = cx->runtime()->activation(); if (!act) return; act->unhideScriptedCaller(); diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index 41d5bf37e423..45bfe83762ba 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -1047,7 +1047,7 @@ JSContext::saveFrameChain() if (!savedFrameChains_.append(SavedFrameChain(compartment(), enterCompartmentDepth_))) return false; - if (Activation *act = mainThread().activation()) + if (Activation *act = runtime()->activation()) act->saveFrameChain(); setCompartment(nullptr); @@ -1065,7 +1065,7 @@ JSContext::restoreFrameChain() setCompartment(sfc.compartment); enterCompartmentDepth_ = sfc.enterCompartmentCount; - if (Activation *act = mainThread().activation()) + if (Activation *act = runtime()->activation()) act->restoreFrameChain(); } @@ -1190,7 +1190,7 @@ void * ExclusiveContext::stackLimitAddressForJitCode(StackKind kind) { #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - return runtime_->mainThread.addressOfSimulatorStackLimit(); + return runtime_->addressOfSimulatorStackLimit(); #endif return stackLimitAddress(kind); } diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index 12c9c76738ab..73d326b6298a 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -241,6 +241,7 @@ class ExclusiveContext : public ContextFriendFields, void *runtimeAddressOfInterruptUint32() { return runtime_->addressOfInterruptUint32(); } void *stackLimitAddress(StackKind kind) { return &runtime_->mainThread.nativeStackLimit[kind]; } void *stackLimitAddressForJitCode(StackKind kind); + uintptr_t stackLimit(StackKind kind) { return runtime_->mainThread.nativeStackLimit[kind]; } size_t gcSystemPageSize() { return gc::SystemPageSize(); } bool canUseSignalHandlers() const { return runtime_->canUseSignalHandlers(); } bool jitSupportsFloatingPoint() const { return runtime_->jitSupportsFloatingPoint; } @@ -435,16 +436,16 @@ struct JSContext : public js::ExclusiveContext, bool currentlyRunning() const; bool currentlyRunningInInterpreter() const { - return mainThread().activation()->isInterpreter(); + return runtime_->activation()->isInterpreter(); } bool currentlyRunningInJit() const { - return mainThread().activation()->isJit(); + return runtime_->activation()->isJit(); } js::InterpreterFrame *interpreterFrame() const { - return mainThread().activation()->asInterpreter()->current(); + return runtime_->activation()->asInterpreter()->current(); } js::InterpreterRegs &interpreterRegs() const { - return mainThread().activation()->asInterpreter()->regs(); + return runtime_->activation()->asInterpreter()->regs(); } /* diff --git a/js/src/jscntxtinlines.h b/js/src/jscntxtinlines.h index 780b9697467c..55402788d209 100644 --- a/js/src/jscntxtinlines.h +++ b/js/src/jscntxtinlines.h @@ -448,7 +448,7 @@ JSContext::currentScript(jsbytecode **ppc, if (ppc) *ppc = nullptr; - js::Activation *act = mainThread().activation(); + js::Activation *act = runtime()->activation(); while (act && (act->cx() != this || (act->isJit() && !act->asJit()->isActive()))) act = act->prev(); diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index be878cd66fa2..160e1b210753 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -2285,6 +2285,7 @@ TypeCompartment::addAllocationSiteTypeObject(JSContext *cx, AllocationSiteKey ke allocationSiteTable = cx->new_(); if (!allocationSiteTable || !allocationSiteTable->init()) { js_delete(allocationSiteTable); + allocationSiteTable = nullptr; return nullptr; } } @@ -3330,7 +3331,8 @@ TypeObject::clearNewScript(ExclusiveContext *cx) newScript->rollbackPartiallyInitializedObjects(cx->asJSContext(), this); } else { // Threads with an ExclusiveContext are not allowed to run scripts. - MOZ_ASSERT(!cx->perThreadData->activation()); + MOZ_ASSERT(!cx->perThreadData->runtimeIfOnOwnerThread() || + !cx->perThreadData->runtimeIfOnOwnerThread()->activation()); } js_delete(newScript); @@ -4611,7 +4613,9 @@ ConstraintTypeSet::sweep(Zone *zone, AutoClearTypeInferenceStateOnOOM &oom) objectCount = 0; for (unsigned i = 0; i < oldCapacity; i++) { TypeObjectKey *object = oldArray[i]; - if (object && !IsAboutToBeFinalized(&object)) { + if (!object) + continue; + if (!IsAboutToBeFinalized(&object)) { TypeObjectKey **pentry = HashSetInsert (zone->types.typeLifoAlloc, objectSet, objectCount, object); @@ -4624,16 +4628,28 @@ ConstraintTypeSet::sweep(Zone *zone, AutoClearTypeInferenceStateOnOOM &oom) objectCount = 0; break; } + } else if (object->isTypeObject() && object->asTypeObject()->unknownProperties()) { + // Object sets containing objects with unknown properties might + // not be complete. Mark the type set as unknown, which it will + // be treated as during Ion compilation. + flags |= TYPE_FLAG_ANYOBJECT; + clearObjects(); + objectCount = 0; + break; } } setBaseObjectCount(objectCount); } else if (objectCount == 1) { TypeObjectKey *object = (TypeObjectKey *) objectSet; - if (IsAboutToBeFinalized(&object)) { + if (!IsAboutToBeFinalized(&object)) { + objectSet = reinterpret_cast(object); + } else { + // As above, mark type sets containing objects with unknown + // properties as unknown. + if (object->isTypeObject() && object->asTypeObject()->unknownProperties()) + flags |= TYPE_FLAG_ANYOBJECT; objectSet = nullptr; setBaseObjectCount(0); - } else { - objectSet = reinterpret_cast(object); } } diff --git a/js/src/jspubtd.h b/js/src/jspubtd.h index 15e83e6e752e..45f33f50eff1 100644 --- a/js/src/jspubtd.h +++ b/js/src/jspubtd.h @@ -454,7 +454,7 @@ struct PerThreadDataFriendFields } /* Limit pointer for checking native stack consumption. */ - uintptr_t nativeStackLimit[StackKindCount]; + uintptr_t nativeStackLimit[js::StackKindCount]; static const size_t RuntimeMainThreadOffset = offsetof(RuntimeDummy, mainThread); diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 0677cea0c12e..aa34f408c384 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -4209,7 +4209,7 @@ EnableSingleStepProfiling(JSContext *cx, unsigned argc, Value *vp) #if defined(JS_ARM_SIMULATOR) CallArgs args = CallArgsFromVp(argc, vp); - jit::Simulator *sim = cx->runtime()->mainThread.simulator(); + jit::Simulator *sim = cx->runtime()->simulator(); sim->enable_single_stepping(SingleStepCallback, cx->runtime()); args.rval().setUndefined(); @@ -4226,7 +4226,7 @@ DisableSingleStepProfiling(JSContext *cx, unsigned argc, Value *vp) #if defined(JS_ARM_SIMULATOR) CallArgs args = CallArgsFromVp(argc, vp); - jit::Simulator *sim = cx->runtime()->mainThread.simulator(); + jit::Simulator *sim = cx->runtime()->simulator(); sim->disable_single_stepping(); AutoValueVector elems(cx); diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 1d5787f8ab45..fdba1459339e 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -1084,6 +1084,42 @@ Debugger::receiveCompletionValue(Maybe &ac, bool ok, return newCompletionValue(cx, status, value, vp); } +static bool +GetStatusProperty(JSContext *cx, HandleObject obj, HandlePropertyName name, JSTrapStatus status, + JSTrapStatus *statusOut, MutableHandleValue vp, int *hits) +{ + bool found; + if (!HasProperty(cx, obj, name, &found)) + return false; + if (found) { + ++*hits; + *statusOut = status; + if (!GetProperty(cx, obj, obj, name, vp)) + return false; + } + return true; +} + +static bool +ParseResumptionValueAsObject(JSContext *cx, HandleValue rv, JSTrapStatus *statusp, + MutableHandleValue vp) +{ + int hits = 0; + if (rv.isObject()) { + RootedObject obj(cx, &rv.toObject()); + if (!GetStatusProperty(cx, obj, cx->names().return_, JSTRAP_RETURN, statusp, vp, &hits)) + return false; + if (!GetStatusProperty(cx, obj, cx->names().throw_, JSTRAP_THROW, statusp, vp, &hits)) + return false; + } + + if (hits != 1) { + JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_DEBUG_BAD_RESUMPTION); + return false; + } + return true; +} + JSTrapStatus Debugger::parseResumptionValue(Maybe &ac, bool ok, const Value &rv, MutableHandleValue vp, bool callHook) @@ -1100,35 +1136,16 @@ Debugger::parseResumptionValue(Maybe &ac, bool ok, const Value return JSTRAP_ERROR; } - /* Check that rv is {return: val} or {throw: val}. */ JSContext *cx = ac->context()->asJSContext(); - Rooted obj(cx); - RootedShape shape(cx); - RootedId returnId(cx, NameToId(cx->names().return_)); - RootedId throwId(cx, NameToId(cx->names().throw_)); - bool okResumption = rv.isObject(); - if (okResumption) { - obj = &rv.toObject(); - okResumption = obj->is(); - } - if (okResumption) { - shape = obj->lastProperty(); - okResumption = shape->previous() && - !shape->previous()->previous() && - (shape->propid() == returnId || shape->propid() == throwId) && - shape->isDataDescriptor(); - } - if (!okResumption) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_DEBUG_BAD_RESUMPTION); + JSTrapStatus status = JSTRAP_CONTINUE; + RootedValue v(cx); + RootedValue rvRoot(cx, rv); + if (!ParseResumptionValueAsObject(cx, rvRoot, &status, &v) || + !unwrapDebuggeeValue(cx, &v)) + { return handleUncaughtException(ac, vp, callHook); } - HandleNativeObject nobj = obj.as(); - - RootedValue v(cx, vp.get()); - if (!NativeGetExistingProperty(cx, obj, nobj, shape, &v) || !unwrapDebuggeeValue(cx, &v)) - return handleUncaughtException(ac, &v, callHook); - ac.reset(); if (!cx->compartment()->wrap(cx, &v)) { vp.setUndefined(); @@ -1136,7 +1153,7 @@ Debugger::parseResumptionValue(Maybe &ac, bool ok, const Value } vp.set(v); - return shape->propid() == returnId ? JSTRAP_RETURN : JSTRAP_THROW; + return status; } static bool diff --git a/js/src/vm/NativeObject.cpp b/js/src/vm/NativeObject.cpp index 7a51d549f911..f24102bc8746 100644 --- a/js/src/vm/NativeObject.cpp +++ b/js/src/vm/NativeObject.cpp @@ -1518,22 +1518,38 @@ js::NativeDefineElement(ExclusiveContext *cx, HandleNativeObject obj, uint32_t i return NativeDefineProperty(cx, obj, id, value, getter, setter, attrs); } + +/*** [[Get]] *************************************************************************************/ + +static inline bool +CallGetter(JSContext* cx, HandleObject receiver, HandleShape shape, MutableHandleValue vp) +{ + MOZ_ASSERT(!shape->hasDefaultGetter()); + + if (shape->hasGetterValue()) { + Value fval = shape->getterValue(); + return InvokeGetterOrSetter(cx, receiver, fval, 0, 0, vp); + } + + RootedId id(cx, shape->propid()); + return CallJSPropertyOp(cx, shape->getterOp(), receiver, id, vp); +} + template static MOZ_ALWAYS_INLINE bool -NativeGetExistingPropertyInline(JSContext *cx, - typename MaybeRooted::HandleType obj, - typename MaybeRooted::HandleType receiver, - typename MaybeRooted::HandleType pobj, - typename MaybeRooted::HandleType shape, - typename MaybeRooted::MutableHandleType vp) +GetExistingProperty(JSContext *cx, + typename MaybeRooted::HandleType receiver, + typename MaybeRooted::HandleType obj, + typename MaybeRooted::HandleType shape, + typename MaybeRooted::MutableHandleType vp) { if (shape->hasSlot()) { - vp.set(pobj->getSlot(shape->slot())); + vp.set(obj->getSlot(shape->slot())); MOZ_ASSERT_IF(!vp.isMagic(JS_UNINITIALIZED_LEXICAL) && - !pobj->hasSingletonType() && - !pobj->template is() && + !obj->hasSingletonType() && + !obj->template is() && shape->hasDefaultGetter(), - js::types::TypeHasProperty(cx, pobj->type(), shape->propid(), vp)); + js::types::TypeHasProperty(cx, obj->type(), shape->propid(), vp)); } else { vp.setUndefined(); } @@ -1559,40 +1575,41 @@ NativeGetExistingPropertyInline(JSContext *cx, if (!allowGC) return false; - if (!shape->get(cx, + if (!CallGetter(cx, MaybeRooted::toHandle(receiver), - MaybeRooted::toHandle(obj), - MaybeRooted::toHandle(pobj), + MaybeRooted::toHandle(shape), MaybeRooted::toMutableHandle(vp))) { return false; } - /* Update slotful shapes according to the value produced by the getter. */ - if (shape->hasSlot() && pobj->contains(cx, shape)) - pobj->setSlot(shape->slot(), vp); + // Ancient nonstandard extension: via the JSAPI it's possible to create a + // data property that has both a slot and a getter. In that case, copy the + // value returned by the getter back into the slot. + if (shape->hasSlot() && obj->contains(cx, shape)) + obj->setSlot(shape->slot(), vp); return true; } bool -js::NativeGetExistingProperty(JSContext *cx, HandleObject obj, HandleNativeObject pobj, +js::NativeGetExistingProperty(JSContext *cx, HandleObject receiver, HandleNativeObject obj, HandleShape shape, MutableHandleValue vp) { - return NativeGetExistingPropertyInline(cx, obj, obj, pobj, shape, vp); + return GetExistingProperty(cx, receiver, obj, shape, vp); } /* * Given pc pointing after a property accessing bytecode, return true if the - * access is "object-detecting" in the sense used by web scripts, e.g., when - * checking whether document.all is defined. + * access is "property-detecting" -- that is, if we shouldn't warn about it + * even if no such property is found and strict warnings are enabled. */ static bool Detecting(JSContext *cx, JSScript *script, jsbytecode *pc) { MOZ_ASSERT(script->containsPC(pc)); - /* General case: a branch or equality op follows the access. */ + // General case: a branch or equality op follows the access. JSOp op = JSOp(*pc); if (js_CodeSpec[op].format & JOF_DETECTING) return true; @@ -1600,10 +1617,7 @@ Detecting(JSContext *cx, JSScript *script, jsbytecode *pc) jsbytecode *endpc = script->codeEnd(); if (op == JSOP_NULL) { - /* - * Special case #1: handle (document.all == null). Don't sweat - * about JS1.2's revision of the equality operators here. - */ + // Special case #1: don't warn about (obj.prop == null). if (++pc < endpc) { op = JSOp(*pc); return op == JSOP_EQ || op == JSOP_NE; @@ -1612,11 +1626,7 @@ Detecting(JSContext *cx, JSScript *script, jsbytecode *pc) } if (op == JSOP_GETGNAME || op == JSOP_GETNAME) { - /* - * Special case #2: handle (document.all == undefined). Don't worry - * about a local variable named |undefined| shadowing the immutable - * global binding...because, really? - */ + // Special case #2: don't warn about (obj.prop == undefined). JSAtom *atom = script->getAtom(GET_UINT32_INDEX(pc)); if (atom == cx->names().undefined && (pc += js_CodeSpec[op].length) < endpc) { @@ -1628,149 +1638,185 @@ Detecting(JSContext *cx, JSScript *script, jsbytecode *pc) return false; } +/* + * Finish getting the property `receiver[id]` after looking at every object on + * the prototype chain and not finding any such property. + * + * Per the spec, this should just set the result to `undefined` and call it a + * day. However: + * + * 1. We add support for the nonstandard JSClass::getProperty hook. + * + * 2. This function also runs when we're evaluating an expression that's an + * Identifier (that is, an unqualified name lookup), so we need to figure + * out if that's what's happening and throw a ReferenceError if so. + * + * 3. We also emit an optional warning for this. (It's not super useful on the + * web, as there are too many false positives, but anecdotally useful in + * Gecko code.) + */ +static bool +GetNonexistentProperty(JSContext *cx, HandleNativeObject obj, HandleId id, + HandleObject receiver, MutableHandleValue vp) +{ + vp.setUndefined(); + + // Non-standard extension: Call the getProperty hook. If it sets vp to a + // value other than undefined, we're done. If not, fall through to the + // warning/error checks below. + if (JSPropertyOp getProperty = obj->getClass()->getProperty) { + if (!CallJSPropertyOp(cx, getProperty, obj, id, vp)) + return false; + + if (!vp.isUndefined()) + return true; + } + + // If we are doing a name lookup, this is a ReferenceError. + jsbytecode *pc = nullptr; + RootedScript script(cx, cx->currentScript(&pc)); + if (!pc) + return true; + JSOp op = (JSOp) *pc; + if (op == JSOP_GETXPROP) { + JSAutoByteString printable; + if (js_ValueToPrintable(cx, IdToValue(id), &printable)) + js_ReportIsNotDefined(cx, printable.ptr()); + return false; + } + + // Give a strict warning if foo.bar is evaluated by a script for an object + // foo with no property named 'bar'. + // + // Don't warn if extra warnings not enabled or for random getprop + // operations. + if (!cx->compartment()->options().extraWarnings(cx) || (op != JSOP_GETPROP && op != JSOP_GETELEM)) + return true; + + // Don't warn repeatedly for the same script. + if (!script || script->warnedAboutUndefinedProp()) + return true; + + // Don't warn in self-hosted code (where the further presence of + // JS::RuntimeOptions::werror() would result in impossible-to-avoid + // errors to entirely-innocent client code). + if (script->selfHosted()) + return true; + + // We may just be checking if that object has an iterator. + if (JSID_IS_ATOM(id, cx->names().iteratorIntrinsic)) + return true; + + // Do not warn about tests like (obj[prop] == undefined). + pc += js_CodeSpec[op].length; + if (Detecting(cx, script, pc)) + return true; + + unsigned flags = JSREPORT_WARNING | JSREPORT_STRICT; + script->setWarnedAboutUndefinedProp(); + + // Ok, bad undefined property reference: whine about it. + RootedValue val(cx, IdToValue(id)); + return js_ReportValueErrorFlags(cx, flags, JSMSG_UNDEFINED_PROP, JSDVG_IGNORE_STACK, val, + js::NullPtr(), nullptr, nullptr); +} + +/* The NoGC version of GetNonexistentProperty, present only to make types line up. */ +bool +GetNonexistentProperty(JSContext *cx, NativeObject *obj, jsid id, JSObject *receiver, + FakeMutableHandle vp) +{ + return false; +} + +static inline bool +GeneralizedGetProperty(JSContext *cx, HandleObject obj, HandleId id, HandleObject receiver, + MutableHandleValue vp) +{ + JS_CHECK_RECURSION(cx, return false); + return GetProperty(cx, obj, receiver, id, vp); +} + +static inline bool +GeneralizedGetProperty(JSContext *cx, JSObject *obj, jsid id, JSObject *receiver, + FakeMutableHandle vp) +{ + JS_CHECK_RECURSION_DONT_REPORT(cx, return false); + return GetPropertyNoGC(cx, obj, receiver, id, vp.address()); +} + template static MOZ_ALWAYS_INLINE bool -GetPropertyHelperInline(JSContext *cx, +NativeGetPropertyInline(JSContext *cx, typename MaybeRooted::HandleType obj, typename MaybeRooted::HandleType receiver, typename MaybeRooted::HandleType id, typename MaybeRooted::MutableHandleType vp) { - /* This call site is hot -- use the always-inlined variant of LookupNativeProperty(). */ - typename MaybeRooted::RootType obj2(cx); + typename MaybeRooted::RootType pobj(cx, obj); typename MaybeRooted::RootType shape(cx); - if (!LookupPropertyInline(cx, obj, id, &obj2, &shape)) - return false; - if (!shape) { - if (!allowGC) + // This loop isn't explicit in the spec algorithm. See the comment on step + // 4.d below. + for (;;) { + // Steps 2-3. ('done' is a SpiderMonkey-specific thing, used below.) + bool done; + if (!LookupOwnPropertyInline(cx, pobj, id, &shape, &done)) return false; - vp.setUndefined(); - - if (JSPropertyOp getProperty = obj->getClass()->getProperty) { - if (!CallJSPropertyOp(cx, getProperty, - MaybeRooted::toHandle(obj), - MaybeRooted::toHandle(id), - MaybeRooted::toMutableHandle(vp))) - { - return false; + if (shape) { + // Steps 5-8. Special case for dense elements because + // GetExistingProperty doesn't support those. + if (IsImplicitDenseOrTypedArrayElement(shape)) { + vp.set(pobj->getDenseOrTypedArrayElement(JSID_TO_INT(id))); + return true; } + return GetExistingProperty(cx, receiver, pobj, shape, vp); } - /* - * Give a strict warning if foo.bar is evaluated by a script for an - * object foo with no property named 'bar'. - */ - if (vp.isUndefined()) { - jsbytecode *pc = nullptr; - RootedScript script(cx, cx->currentScript(&pc)); - if (!pc) - return true; - JSOp op = (JSOp) *pc; + // Steps 4.a-b. The check for 'done' on this next line is tricky. + // done can be true in exactly these unlikely-sounding cases: + // - We're looking up an element, and pobj is a TypedArray that + // doesn't have that many elements. + // - We're being called from a resolve hook to assign to the property + // being resolved. + // What they all have in common is we do not want to keep walking + // the prototype chain. + RootedObject proto(cx, done ? nullptr : pobj->getProto()); - if (op == JSOP_GETXPROP) { - /* Undefined property during a name lookup, report an error. */ - JSAutoByteString printable; - if (js_ValueToPrintable(cx, IdToValue(id), &printable)) - js_ReportIsNotDefined(cx, printable.ptr()); - return false; - } + // Step 4.c. The spec algorithm simply returns undefined if proto is + // null, but see the comment on GetNonexistentProperty. + if (!proto) + return GetNonexistentProperty(cx, obj, id, receiver, vp); - /* Don't warn if extra warnings not enabled or for random getprop operations. */ - if (!cx->compartment()->options().extraWarnings(cx) || (op != JSOP_GETPROP && op != JSOP_GETELEM)) - return true; + // Step 4.d. If the prototype is also native, this step is a + // recursive tail call, and we don't need to go through all the + // plumbing of JSObject::getGeneric; the top of the loop is where + // we're going to end up anyway. But if pobj is non-native, + // that optimization would be incorrect. + if (!proto->isNative()) + return GeneralizedGetProperty(cx, proto, id, receiver, vp); - /* Don't warn repeatedly for the same script. */ - if (!script || script->warnedAboutUndefinedProp()) - return true; - - /* - * Don't warn in self-hosted code (where the further presence of - * JS::RuntimeOptions::werror() would result in impossible-to-avoid - * errors to entirely-innocent client code). - */ - if (script->selfHosted()) - return true; - - /* We may just be checking if that object has an iterator. */ - if (JSID_IS_ATOM(id, cx->names().iteratorIntrinsic)) - return true; - - /* Do not warn about tests like (obj[prop] == undefined). */ - pc += js_CodeSpec[op].length; - if (Detecting(cx, script, pc)) - return true; - - unsigned flags = JSREPORT_WARNING | JSREPORT_STRICT; - script->setWarnedAboutUndefinedProp(); - - /* Ok, bad undefined property reference: whine about it. */ - RootedValue val(cx, IdToValue(id)); - if (!js_ReportValueErrorFlags(cx, flags, JSMSG_UNDEFINED_PROP, - JSDVG_IGNORE_STACK, val, js::NullPtr(), - nullptr, nullptr)) - { - return false; - } - } - return true; + pobj = &proto->as(); } - - if (!obj2->isNative()) { - if (!allowGC) - return false; - HandleObject obj2Handle = MaybeRooted::toHandle(obj2); - HandleObject receiverHandle = MaybeRooted::toHandle(receiver); - HandleId idHandle = MaybeRooted::toHandle(id); - MutableHandleValue vpHandle = MaybeRooted::toMutableHandle(vp); - return obj2->template is() - ? Proxy::get(cx, obj2Handle, receiverHandle, idHandle, vpHandle) - : GetProperty(cx, obj2Handle, obj2Handle, idHandle, vpHandle); - } - - typename MaybeRooted::HandleType nobj2 = - MaybeRooted::template downcastHandle(obj2); - - if (IsImplicitDenseOrTypedArrayElement(shape)) { - vp.set(nobj2->getDenseOrTypedArrayElement(JSID_TO_INT(id))); - return true; - } - - // This call site is hot -- use the always-inlined variant of - // NativeGetExistingProperty(). - if (!NativeGetExistingPropertyInline(cx, obj, receiver, nobj2, shape, vp)) - return false; - - return true; } bool js::NativeGetProperty(JSContext *cx, HandleNativeObject obj, HandleObject receiver, HandleId id, MutableHandleValue vp) { - /* This call site is hot -- use the always-inlined variant of GetPropertyHelper(). */ - return GetPropertyHelperInline(cx, obj, receiver, id, vp); + return NativeGetPropertyInline(cx, obj, receiver, id, vp); } bool js::NativeGetPropertyNoGC(JSContext *cx, NativeObject *obj, JSObject *receiver, jsid id, Value *vp) { - AutoAssertNoException nogc(cx); - return GetPropertyHelperInline(cx, obj, receiver, id, vp); + AutoAssertNoException noexc(cx); + return NativeGetPropertyInline(cx, obj, receiver, id, vp); } -bool -js::NativeGetElement(JSContext *cx, HandleNativeObject obj, HandleObject receiver, uint32_t index, - MutableHandleValue vp) -{ - RootedId id(cx); - if (!IndexToId(cx, index, &id)) - return false; - /* This call site is hot -- use the always-inlined variant of js_GetPropertyHelper(). */ - return GetPropertyHelperInline(cx, obj, receiver, id, vp); -} +/*** [[Set]] *************************************************************************************/ static bool MaybeReportUndeclaredVarAssignment(JSContext *cx, JSString *propname) @@ -1796,9 +1842,6 @@ MaybeReportUndeclaredVarAssignment(JSContext *cx, JSString *propname) JSMSG_UNDECLARED_VAR, bytes.ptr()); } - -/*** [[Set]] *************************************************************************************/ - /* * When a [[Set]] operation finds no existing property with the given id * or finds a writable data property on the prototype chain, we end up here. @@ -2069,7 +2112,8 @@ js::NativeSetProperty(JSContext *cx, HandleNativeObject obj, HandleObject receiv RootedNativeObject pobj(cx, obj); // This loop isn't explicit in the spec algorithm. See the comment on step - // 4.c.i below. + // 4.c.i below. (There's a very similar loop in the NativeGetProperty + // implementation, but unfortunately not similar enough to common up.) for (;;) { // Steps 2-3. ('done' is a SpiderMonkey-specific thing, used below.) bool done; @@ -2128,6 +2172,9 @@ js::NativeSetElement(JSContext *cx, HandleNativeObject obj, HandleObject receive return NativeSetProperty(cx, obj, receiver, id, Qualified, vp, strict); } + +/* * */ + bool js::NativeSetPropertyAttributes(JSContext *cx, HandleNativeObject obj, HandleId id, unsigned *attrsp) diff --git a/js/src/vm/NativeObject.h b/js/src/vm/NativeObject.h index 56aef24a1b69..b7f65eb05b3e 100644 --- a/js/src/vm/NativeObject.h +++ b/js/src/vm/NativeObject.h @@ -1322,8 +1322,15 @@ extern bool NativeLookupElement(JSContext *cx, HandleNativeObject obj, uint32_t index, MutableHandleObject objp, MutableHandleShape propp); +/* + * Get a property from `receiver`, after having already done a lookup and found + * the property on a native object `obj`. + * + * `shape` must not be null and must not be an implicit dense property. It must + * be present in obj's shape chain. + */ extern bool -NativeGetExistingProperty(JSContext *cx, HandleObject obj, HandleNativeObject pobj, +NativeGetExistingProperty(JSContext *cx, HandleObject receiver, HandleNativeObject obj, HandleShape shape, MutableHandle vp); extern bool diff --git a/js/src/vm/Runtime.cpp b/js/src/vm/Runtime.cpp index e2a7022dd36c..e7296275ebf1 100644 --- a/js/src/vm/Runtime.cpp +++ b/js/src/vm/Runtime.cpp @@ -73,21 +73,10 @@ const JSSecurityCallbacks js::NullSecurityCallbacks = { }; PerThreadData::PerThreadData(JSRuntime *runtime) : PerThreadDataFriendFields(), runtime_(runtime), - jitTop(nullptr), - jitJSContext(nullptr), - jitActivation(nullptr), - jitStackLimit_(0xbad), #ifdef JS_TRACE_LOGGING traceLogger(nullptr), #endif - activation_(nullptr), - profilingActivation_(nullptr), - asmJSActivationStack_(nullptr), autoFlushICache_(nullptr), -#if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - simulator_(nullptr), - simulatorStackLimit_(0), -#endif dtoaState(nullptr), suppressGC(0), #ifdef DEBUG @@ -100,10 +89,6 @@ PerThreadData::~PerThreadData() { if (dtoaState) js_DestroyDtoaState(dtoaState); - -#if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - js_delete(simulator_); -#endif } bool @@ -113,9 +98,6 @@ PerThreadData::init() if (!dtoaState) return false; - if (!regexpStack.init()) - return false; - return true; } @@ -132,6 +114,13 @@ ReturnZeroSize(const void *p) JSRuntime::JSRuntime(JSRuntime *parentRuntime) : mainThread(this), + jitTop(nullptr), + jitJSContext(nullptr), + jitActivation(nullptr), + jitStackLimit_(0xbad), + activation_(nullptr), + profilingActivation_(nullptr), + asmJSActivationStack_(nullptr), parentRuntime(parentRuntime), interrupt_(false), telemetryCallback(nullptr), @@ -168,6 +157,8 @@ JSRuntime::JSRuntime(JSRuntime *parentRuntime) gc(thisFromCtor()), gcInitialized(false), #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) + simulator_(nullptr), + simulatorStackLimit_(0), simulatorRuntime_(nullptr), #endif scriptAndCountsVector(nullptr), @@ -274,6 +265,9 @@ JSRuntime::init(uint32_t maxbytes, uint32_t maxNurseryBytes) if (!mainThread.init()) return false; + if (!regexpStack.init()) + return false; + js::TlsPerThreadData.set(&mainThread); if (CanUseExtraThreads()) @@ -442,6 +436,7 @@ JSRuntime::~JSRuntime() #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) js::jit::DestroySimulatorRuntime(simulatorRuntime_); + js_delete(simulator_); #endif DebugOnly oldCount = liveRuntimesCount--; @@ -594,7 +589,7 @@ InvokeInterruptCallback(JSContext *cx) } void -PerThreadData::resetJitStackLimit() +JSRuntime::resetJitStackLimit() { // Note that, for now, we use the untrusted limit for ion. This is fine, // because it's the most conservative limit, and if we hit it, we'll bail @@ -602,12 +597,12 @@ PerThreadData::resetJitStackLimit() #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) jitStackLimit_ = jit::Simulator::StackLimit(); #else - jitStackLimit_ = nativeStackLimit[StackForUntrustedScript]; + jitStackLimit_ = mainThread.nativeStackLimit[StackForUntrustedScript]; #endif } void -PerThreadData::initJitStackLimit() +JSRuntime::initJitStackLimit() { resetJitStackLimit(); } @@ -616,7 +611,7 @@ void JSRuntime::requestInterrupt(InterruptMode mode) { interrupt_ = true; - mainThread.jitStackLimit_ = UINTPTR_MAX; + jitStackLimit_ = UINTPTR_MAX; if (mode == JSRuntime::RequestInterruptUrgent) InterruptRunningJitCode(this); @@ -626,9 +621,9 @@ bool JSRuntime::handleInterrupt(JSContext *cx) { MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime())); - if (interrupt_ || mainThread.jitStackLimit_ == UINTPTR_MAX) { + if (interrupt_ || jitStackLimit_ == UINTPTR_MAX) { interrupt_ = false; - mainThread.resetJitStackLimit(); + resetJitStackLimit(); return InvokeInterruptCallback(cx); } return true; diff --git a/js/src/vm/Runtime.h b/js/src/vm/Runtime.h index 7f84a4c8bfd0..940d5972d30a 100644 --- a/js/src/vm/Runtime.h +++ b/js/src/vm/Runtime.h @@ -481,6 +481,11 @@ void DisableExtraThreads(); */ class PerThreadData : public PerThreadDataFriendFields { +#ifdef DEBUG + // Grant access to runtime_. + friend void js::AssertCurrentThreadCanLock(RuntimeLock which); +#endif + /* * Backpointer to the full shared JSRuntime* with which this * thread is associated. This is private because accessing the @@ -507,112 +512,14 @@ class PerThreadData : public PerThreadDataFriendFields js::Vector gcSavedRoots; #endif - /* - * If Baseline or Ion code is on the stack, and has called into C++, this - * will be aligned to an exit frame. - */ - uint8_t *jitTop; - - /* - * The current JSContext when entering JIT code. This field may only be used - * from JIT code and C++ directly called by JIT code (otherwise it may refer - * to the wrong JSContext). - */ - JSContext *jitJSContext; - - /* - * Points to the most recent JitActivation pushed on the thread. - * See JitActivation constructor in vm/Stack.cpp - */ - js::jit::JitActivation *jitActivation; - - /* See comment for JSRuntime::interrupt_. */ - private: - mozilla::Atomic jitStackLimit_; - void resetJitStackLimit(); - friend struct ::JSRuntime; - public: - void initJitStackLimit(); - - uintptr_t jitStackLimit() const { return jitStackLimit_; } - - // For read-only JIT use: - void *addressOfJitStackLimit() { return &jitStackLimit_; } - static size_t offsetOfJitStackLimit() { return offsetof(PerThreadData, jitStackLimit_); } - - // Information about the heap allocated backtrack stack used by RegExp JIT code. - irregexp::RegExpStack regexpStack; - #ifdef JS_TRACE_LOGGING TraceLoggerThread *traceLogger; #endif - private: - friend class js::Activation; - friend class js::ActivationIterator; - friend class js::jit::JitActivation; - friend class js::AsmJSActivation; - friend class js::jit::CompileRuntime; -#ifdef DEBUG - friend void js::AssertCurrentThreadCanLock(RuntimeLock which); -#endif - - /* - * Points to the most recent activation running on the thread. - * See Activation comment in vm/Stack.h. - */ - js::Activation *activation_; - - /* - * Points to the most recent profiling activation running on the - * thread. - */ - js::Activation * volatile profilingActivation_; - - /* See AsmJSActivation comment. */ - js::AsmJSActivation * volatile asmJSActivationStack_; - /* Pointer to the current AutoFlushICache. */ js::jit::AutoFlushICache *autoFlushICache_; -#if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - js::jit::Simulator *simulator_; - uintptr_t simulatorStackLimit_; -#endif - public: - js::Activation *const *addressOfActivation() const { - return &activation_; - } - static unsigned offsetOfAsmJSActivationStackReadOnly() { - return offsetof(PerThreadData, asmJSActivationStack_); - } - static unsigned offsetOfActivation() { - return offsetof(PerThreadData, activation_); - } - - js::Activation *profilingActivation() const { - return profilingActivation_; - } - void *addressOfProfilingActivation() { - return (void*) &profilingActivation_; - } - static unsigned offsetOfProfilingActivation() { - return offsetof(PerThreadData, profilingActivation_); - } - - js::AsmJSActivation *asmJSActivationStack() const { - return asmJSActivationStack_; - } - static js::AsmJSActivation *innermostAsmJSActivation() { - PerThreadData *ptd = TlsPerThreadData.get(); - return ptd ? ptd->asmJSActivationStack_ : nullptr; - } - - js::Activation *activation() const { - return activation_; - } - /* State used by jsdtoa.cpp. */ DtoaState *dtoaState; @@ -659,21 +566,10 @@ class PerThreadData : public PerThreadDataFriendFields { MOZ_ASSERT(!pt->runtime_); pt->runtime_ = rt; -#if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - // The simulator has a pointer to its SimulatorRuntime, but helper threads - // don't have a simulator as they don't run JIT code so this pointer need not - // be updated. All the paths that the helper threads use access the - // SimulatorRuntime via the PerThreadData. - MOZ_ASSERT(!pt->simulator_); -#endif } ~AutoEnterRuntime() { pt->runtime_ = nullptr; -#if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) - // Check that helper threads have not run JIT code and/or added a simulator. - MOZ_ASSERT(!pt->simulator_); -#endif } }; @@ -684,7 +580,6 @@ class PerThreadData : public PerThreadDataFriendFields js::jit::Simulator *simulator() const; void setSimulator(js::jit::Simulator *sim); js::jit::SimulatorRuntime *simulatorRuntime() const; - uintptr_t *addressOfSimulatorStackLimit(); #endif }; @@ -707,6 +602,97 @@ struct JSRuntime : public JS::shadow::Runtime, */ js::PerThreadData mainThread; + /* + * If Baseline or Ion code is on the stack, and has called into C++, this + * will be aligned to an exit frame. + */ + uint8_t *jitTop; + + /* + * The current JSContext when entering JIT code. This field may only be used + * from JIT code and C++ directly called by JIT code (otherwise it may refer + * to the wrong JSContext). + */ + JSContext *jitJSContext; + + /* + * Points to the most recent JitActivation pushed on the thread. + * See JitActivation constructor in vm/Stack.cpp + */ + js::jit::JitActivation *jitActivation; + + /* See comment for JSRuntime::interrupt_. */ + private: + mozilla::Atomic jitStackLimit_; + void resetJitStackLimit(); + + public: + void initJitStackLimit(); + + uintptr_t jitStackLimit() const { return jitStackLimit_; } + + // For read-only JIT use: + void *addressOfJitStackLimit() { return &jitStackLimit_; } + static size_t offsetOfJitStackLimit() { return offsetof(JSRuntime, jitStackLimit_); } + + // Information about the heap allocated backtrack stack used by RegExp JIT code. + js::irregexp::RegExpStack regexpStack; + + private: + friend class js::Activation; + friend class js::ActivationIterator; + friend class js::jit::JitActivation; + friend class js::AsmJSActivation; + friend class js::jit::CompileRuntime; +#ifdef DEBUG + friend void js::AssertCurrentThreadCanLock(js::RuntimeLock which); +#endif + + /* + * Points to the most recent activation running on the thread. + * See Activation comment in vm/Stack.h. + */ + js::Activation *activation_; + + /* + * Points to the most recent profiling activation running on the + * thread. + */ + js::Activation * volatile profilingActivation_; + + /* See AsmJSActivation comment. */ + js::AsmJSActivation * volatile asmJSActivationStack_; + + public: + js::Activation *const *addressOfActivation() const { + return &activation_; + } + static unsigned offsetOfActivation() { + return offsetof(JSRuntime, activation_); + } + + js::Activation *profilingActivation() const { + return profilingActivation_; + } + void *addressOfProfilingActivation() { + return (void*) &profilingActivation_; + } + static unsigned offsetOfProfilingActivation() { + return offsetof(JSRuntime, profilingActivation_); + } + + js::AsmJSActivation *asmJSActivationStack() const { + return asmJSActivationStack_; + } + static js::AsmJSActivation *innermostAsmJSActivation() { + js::PerThreadData *ptd = js::TlsPerThreadData.get(); + return ptd ? ptd->runtimeFromMainThread()->asmJSActivationStack_ : nullptr; + } + + js::Activation *activation() const { + return activation_; + } + /* * If non-null, another runtime guaranteed to outlive this one and whose * permanent data may be used by this one where possible. @@ -988,6 +974,8 @@ struct JSRuntime : public JS::shadow::Runtime, } #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) + js::jit::Simulator *simulator_; + uintptr_t simulatorStackLimit_; js::jit::SimulatorRuntime *simulatorRuntime_; #endif @@ -997,6 +985,9 @@ struct JSRuntime : public JS::shadow::Runtime, } #if defined(JS_ARM_SIMULATOR) || defined(JS_MIPS_SIMULATOR) + js::jit::Simulator *simulator() const; + void setSimulator(js::jit::Simulator *sim); + uintptr_t *addressOfSimulatorStackLimit(); js::jit::SimulatorRuntime *simulatorRuntime() const; void setSimulatorRuntime(js::jit::SimulatorRuntime *srt); #endif @@ -1438,7 +1429,7 @@ namespace js { static inline JSContext * GetJSContextFromJitCode() { - JSContext *cx = TlsPerThreadData.get()->jitJSContext; + JSContext *cx = js::TlsPerThreadData.get()->runtimeFromMainThread()->jitJSContext; MOZ_ASSERT(cx); return cx; } diff --git a/js/src/vm/SPSProfiler.cpp b/js/src/vm/SPSProfiler.cpp index 459bc6efe29b..3eaf3d6151f2 100644 --- a/js/src/vm/SPSProfiler.cpp +++ b/js/src/vm/SPSProfiler.cpp @@ -99,9 +99,9 @@ SPSProfiler::enable(bool enabled) /* Update lastProfilingFrame to point to the top-most JS jit-frame currently on * stack. */ - if (rt->mainThread.jitActivation) { - void *lastProfilingFrame = GetTopProfilingJitFrame(rt->mainThread.jitTop); - rt->mainThread.jitActivation->setLastProfilingFrame(lastProfilingFrame); + if (rt->jitActivation) { + void *lastProfilingFrame = GetTopProfilingJitFrame(rt->jitTop); + rt->jitActivation->setLastProfilingFrame(lastProfilingFrame); } } diff --git a/js/src/vm/Shape-inl.h b/js/src/vm/Shape-inl.h index 0b5c3ebeb807..49a6483b464a 100644 --- a/js/src/vm/Shape-inl.h +++ b/js/src/vm/Shape-inl.h @@ -33,21 +33,6 @@ StackBaseShape::StackBaseShape(ExclusiveContext *cx, const Class *clasp, compartment(cx->compartment_) {} -inline bool -Shape::get(JSContext* cx, HandleObject receiver, JSObject* obj, JSObject *pobj, - MutableHandleValue vp) -{ - MOZ_ASSERT(!hasDefaultGetter()); - - if (hasGetterValue()) { - Value fval = getterValue(); - return InvokeGetterOrSetter(cx, receiver, fval, 0, 0, vp); - } - - RootedId id(cx, propid()); - return CallJSPropertyOp(cx, getterOp(), receiver, id, vp); -} - inline Shape * Shape::search(ExclusiveContext *cx, jsid id) { diff --git a/js/src/vm/Shape.h b/js/src/vm/Shape.h index a7416b02673d..032e017020fc 100644 --- a/js/src/vm/Shape.h +++ b/js/src/vm/Shape.h @@ -917,7 +917,6 @@ class Shape : public gc::TenuredCell setter() == rawSetter; } - bool get(JSContext* cx, HandleObject receiver, JSObject *obj, JSObject *pobj, MutableHandleValue vp); bool set(JSContext* cx, HandleObject obj, HandleObject receiver, bool strict, MutableHandleValue vp); BaseShape *base() const { return base_.get(); } diff --git a/js/src/vm/Stack-inl.h b/js/src/vm/Stack-inl.h index 9497156d57bb..ae702c66c542 100644 --- a/js/src/vm/Stack-inl.h +++ b/js/src/vm/Stack-inl.h @@ -822,21 +822,21 @@ AbstractFramePtr::popWith(JSContext *cx) const Activation::Activation(JSContext *cx, Kind kind) : cx_(cx), compartment_(cx->compartment()), - prev_(cx->perThreadData->activation_), + prev_(cx->runtime_->activation_), prevProfiling_(prev_ ? prev_->mostRecentProfiling() : nullptr), savedFrameChain_(0), hideScriptedCallerCount_(0), kind_(kind) { - cx->perThreadData->activation_ = this; + cx->runtime_->activation_ = this; } Activation::~Activation() { - MOZ_ASSERT_IF(isProfiling(), this != cx_->perThreadData->profilingActivation_); - MOZ_ASSERT(cx_->perThreadData->activation_ == this); + MOZ_ASSERT_IF(isProfiling(), this != cx_->runtime()->profilingActivation_); + MOZ_ASSERT(cx_->runtime_->activation_ == this); MOZ_ASSERT(hideScriptedCallerCount_ == 0); - cx_->perThreadData->activation_ = prev_; + cx_->runtime_->activation_ = prev_; } bool diff --git a/js/src/vm/Stack.cpp b/js/src/vm/Stack.cpp index d9b55daa954e..15cd9ebb45c6 100644 --- a/js/src/vm/Stack.cpp +++ b/js/src/vm/Stack.cpp @@ -1388,11 +1388,11 @@ jit::JitActivation::JitActivation(JSContext *cx, bool active) lastProfilingCallSite_(nullptr) { if (active) { - prevJitTop_ = cx->mainThread().jitTop; - prevJitJSContext_ = cx->mainThread().jitJSContext; - prevJitActivation_ = cx->mainThread().jitActivation; - cx->mainThread().jitJSContext = cx; - cx->mainThread().jitActivation = this; + prevJitTop_ = cx->runtime()->jitTop; + prevJitJSContext_ = cx->runtime()->jitJSContext; + prevJitActivation_ = cx->runtime()->jitActivation; + cx->runtime()->jitJSContext = cx; + cx->runtime()->jitActivation = this; registerProfiling(); } else { @@ -1408,9 +1408,9 @@ jit::JitActivation::~JitActivation() if (isProfiling()) unregisterProfiling(); - cx_->perThreadData->jitTop = prevJitTop_; - cx_->perThreadData->jitJSContext = prevJitJSContext_; - cx_->perThreadData->jitActivation = prevJitActivation_; + cx_->runtime()->jitTop = prevJitTop_; + cx_->runtime()->jitJSContext = prevJitJSContext_; + cx_->runtime()->jitActivation = prevJitActivation_; } // All reocvered value are taken from activation during the bailout. @@ -1453,25 +1453,25 @@ jit::JitActivation::setActive(JSContext *cx, bool active) { // Only allowed to deactivate/activate if activation is top. // (Not tested and will probably fail in other situations.) - MOZ_ASSERT(cx->mainThread().activation_ == this); + MOZ_ASSERT(cx->runtime()->activation_ == this); MOZ_ASSERT(active != active_); if (active) { *((volatile bool *) active_) = true; - prevJitTop_ = cx->mainThread().jitTop; - prevJitJSContext_ = cx->mainThread().jitJSContext; - prevJitActivation_ = cx->mainThread().jitActivation; - cx->mainThread().jitJSContext = cx; - cx->mainThread().jitActivation = this; + prevJitTop_ = cx->runtime()->jitTop; + prevJitJSContext_ = cx->runtime()->jitJSContext; + prevJitActivation_ = cx->runtime()->jitActivation; + cx->runtime()->jitJSContext = cx; + cx->runtime()->jitActivation = this; registerProfiling(); } else { unregisterProfiling(); - cx->mainThread().jitTop = prevJitTop_; - cx->mainThread().jitJSContext = prevJitJSContext_; - cx->mainThread().jitActivation = prevJitActivation_; + cx->runtime()->jitTop = prevJitTop_; + cx->runtime()->jitJSContext = prevJitJSContext_; + cx->runtime()->jitActivation = prevJitActivation_; *((volatile bool *) active_) = false; } @@ -1626,8 +1626,8 @@ AsmJSActivation::AsmJSActivation(JSContext *cx, AsmJSModule &module) prevAsmJSForModule_ = module.activation(); module.activation() = this; - prevAsmJS_ = cx->mainThread().asmJSActivationStack_; - cx->mainThread().asmJSActivationStack_ = this; + prevAsmJS_ = cx->runtime()->asmJSActivationStack_; + cx->runtime()->asmJSActivationStack_ = this; // Now that the AsmJSActivation is fully initialized, make it visible to // asynchronous profiling. @@ -1645,9 +1645,9 @@ AsmJSActivation::~AsmJSActivation() module_.activation() = prevAsmJSForModule_; JSContext *cx = cx_->asJSContext(); - MOZ_ASSERT(cx->mainThread().asmJSActivationStack_ == this); + MOZ_ASSERT(cx->runtime()->asmJSActivationStack_ == this); - cx->mainThread().asmJSActivationStack_ = prevAsmJS_; + cx->runtime()->asmJSActivationStack_ = prevAsmJS_; } InterpreterFrameIterator & @@ -1670,35 +1670,33 @@ void Activation::registerProfiling() { MOZ_ASSERT(isProfiling()); - cx_->perThreadData->profilingActivation_ = this; + cx_->runtime()->profilingActivation_ = this; } void Activation::unregisterProfiling() { MOZ_ASSERT(isProfiling()); - MOZ_ASSERT(cx_->perThreadData->profilingActivation_ == this); + MOZ_ASSERT(cx_->runtime()->profilingActivation_ == this); // There may be a non-active jit activation in the linked list. Skip past it. Activation *prevProfiling = prevProfiling_; while (prevProfiling && prevProfiling->isJit() && !prevProfiling->asJit()->isActive()) prevProfiling = prevProfiling->prevProfiling_; - cx_->perThreadData->profilingActivation_ = prevProfiling; + cx_->runtime()->profilingActivation_ = prevProfiling; } ActivationIterator::ActivationIterator(JSRuntime *rt) - : jitTop_(rt->mainThread.jitTop), - activation_(rt->mainThread.activation_) + : jitTop_(rt->jitTop), + activation_(rt->activation_) { settle(); } ActivationIterator::ActivationIterator(PerThreadData *perThreadData) - : jitTop_(perThreadData->jitTop), - activation_(perThreadData->activation_) + : ActivationIterator(perThreadData->runtimeFromMainThread()) { - settle(); } ActivationIterator & @@ -1723,7 +1721,7 @@ ActivationIterator::settle() JS::ProfilingFrameIterator::ProfilingFrameIterator(JSRuntime *rt, const RegisterState &state) : rt_(rt), - activation_(rt->mainThread.profilingActivation()), + activation_(rt->profilingActivation()), savedPrevJitTop_(nullptr) { if (!activation_) @@ -1795,7 +1793,7 @@ JS::ProfilingFrameIterator::iteratorConstruct(const RegisterState &state) if (activation_->isAsmJS()) { new (storage_.addr()) AsmJSProfilingFrameIterator(*activation_->asAsmJS(), state); // Set savedPrevJitTop_ to the actual jitTop_ from the runtime. - savedPrevJitTop_ = activation_->cx()->perThreadData->jitTop; + savedPrevJitTop_ = activation_->cx()->runtime()->jitTop; return; } diff --git a/js/xpconnect/tests/chrome/chrome.ini b/js/xpconnect/tests/chrome/chrome.ini index 4528dd322eb1..d8ef7c4c81e7 100644 --- a/js/xpconnect/tests/chrome/chrome.ini +++ b/js/xpconnect/tests/chrome/chrome.ini @@ -68,6 +68,7 @@ skip-if = buildapp == 'mulet' [test_bug1065185.html] [test_bug1074863.html] [test_bug1092477.xul] +[test_bug1124898.html] [test_xrayToJS.xul] skip-if = buildapp == 'mulet' [test_chrometoSource.xul] diff --git a/js/xpconnect/tests/chrome/test_bug1124898.html b/js/xpconnect/tests/chrome/test_bug1124898.html new file mode 100644 index 000000000000..f650d9a3bfe1 --- /dev/null +++ b/js/xpconnect/tests/chrome/test_bug1124898.html @@ -0,0 +1,46 @@ + + + + + + Test for Bug 1124898 + + + + + + +Mozilla Bug 1124898 +

+ +
+
+ + diff --git a/js/xpconnect/tests/mochitest/file_empty.html b/js/xpconnect/tests/mochitest/file_empty.html index d5eda90338aa..ebe8e56a6864 100644 --- a/js/xpconnect/tests/mochitest/file_empty.html +++ b/js/xpconnect/tests/mochitest/file_empty.html @@ -1,2 +1,3 @@ -Nothing to see here + +empty test pageNothing to see here diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 2090e2441670..9d3948e87263 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -3735,10 +3735,6 @@ already_AddRefed nsDisplayOpacity::BuildLayer(nsDisplayListBuilder* aBuilder, LayerManager* aManager, const ContainerLayerParameters& aContainerParameters) { - if (mOpacity == 0 && mFrame->GetContent() && - !nsLayoutUtils::HasAnimations(mFrame->GetContent(), eCSSProperty_opacity)) { - return nullptr; - } nsRefPtr container = aManager->GetLayerBuilder()-> BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList, aContainerParameters, nullptr); diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index a1402de3cbfb..8942f47a22b4 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -1948,17 +1948,6 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, return; const nsStyleDisplay* disp = StyleDisplay(); - // We can stop right away if this is a zero-opacity stacking context and - // we're painting, and we're not animating opacity. Don't do this - // if we're going to compute plugin geometry, since opacity-0 plugins - // need to have display items built for them. - if (disp->mOpacity == 0.0 && aBuilder->IsForPainting() && - !aBuilder->WillComputePluginGeometry() && - !(disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_OPACITY) && - !nsLayoutUtils::HasAnimations(mContent, eCSSProperty_opacity)) { - return; - } - if (disp->mWillChangeBitField != 0) { aBuilder->AddToWillChangeBudget(this, GetSize()); } diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index cdd262613c51..a4ea9ad1d8fd 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1592,8 +1592,8 @@ skip-if(B2G) fuzzy-if(d2d,52,1051) fuzzy-if(OSX==1008,129,1068) == 586683-1.html == 589615-1b.html 589615-1-ref.html == 589672-1.html 589672-1-ref.html != 589682-1.html 589682-1-notref.html -skip-if(!browserIsRemote) == 593243-1.html 593243-1-ref.html # bug 593168 -skip-if(!browserIsRemote) == 593243-2.html 593243-2-ref.html # bug 593168 +skip-if(!asyncPanZoom) == 593243-1.html 593243-1-ref.html # bug 593168 +skip-if(!asyncPanZoom) == 593243-2.html 593243-2-ref.html # bug 593168 == 593544-1.html 593544-1-ref.html random-if(Android) == 594333-1.html 594333-1-ref.html fuzzy-if(B2G,1,40000) == 594624-1.html 594624-1-ref.html diff --git a/layout/reftests/reftest-sanity/reftest.list b/layout/reftests/reftest-sanity/reftest.list index d79cb6f4c1ec..290c1224ac64 100644 --- a/layout/reftests/reftest-sanity/reftest.list +++ b/layout/reftests/reftest-sanity/reftest.list @@ -90,7 +90,6 @@ fails == data:text/plain,HELLO about:blank needs-focus == data:text/plain, about:blank # Sanity check of viewport+displayport overrides -random-if(!browserIsRemote) == test-displayport.html test-displayport-ref.html # bug 593168 skip-if(!browserIsRemote) != test-displayport-2.html test-displayport-ref.html # bug 593168 skip-if(!browserIsRemote) fails-if(OSX&&layersGPUAccelerated) fuzzy-if(layersOMTC,1,1390) random-if(Android&&AndroidVersion<15) random-if(B2G||B2GDT) == 647192-1.html 647192-1-ref.html skip-if(!browserIsRemote||(B2G&&browserIsRemote)) == 656041-1.html 656041-1-ref.html diff --git a/layout/reftests/reftest-sanity/test-displayport.html b/layout/reftests/reftest-sanity/test-displayport.html deleted file mode 100644 index ba4f823100c4..000000000000 --- a/layout/reftests/reftest-sanity/test-displayport.html +++ /dev/null @@ -1,7 +0,0 @@ - - - -
- - diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 673803c22708..32727da0a5f7 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -571,6 +571,12 @@ pref("apz.test.logging_enabled", false); pref("gfx.hidpi.enabled", 2); #endif +#if !defined(MOZ_WIDGET_GONK) && !defined(MOZ_WIDGET_ANDROID) +// Containerless scrolling for root frames does not yet pass tests on Android +// or B2G. +pref("layout.scroll.root-frame-containers", false); +#endif + // Whether to enable LayerScope tool and default listening port pref("gfx.layerscope.enabled", false); pref("gfx.layerscope.port", 23456); diff --git a/python/README b/python/README index 635edec98e8c..f9e677b5e5df 100644 --- a/python/README +++ b/python/README @@ -12,3 +12,10 @@ What should not go here: Historical information can be found at https://bugzilla.mozilla.org/show_bug.cgi?id=775243 + +## pyyaml | pystache + +Used in taskcluster related mach commands to update download from github +and remove .git and tests. + +Then run tests in taskcluster/tests/ diff --git a/python/mozbuild/mozbuild/virtualenv.py b/python/mozbuild/mozbuild/virtualenv.py index a46c96f02d0a..5d0639885e08 100644 --- a/python/mozbuild/mozbuild/virtualenv.py +++ b/python/mozbuild/mozbuild/virtualenv.py @@ -395,6 +395,8 @@ class VirtualenvManager(object): """ execfile(self.activate_path, dict(__file__=self.activate_path)) + if isinstance(os.environ['PATH'], unicode): + os.environ['PATH'] = os.environ['PATH'].encode('utf-8') def install_pip_package(self, package): """Install a package via pip. diff --git a/python/pystache/.gitignore b/python/pystache/.gitignore new file mode 100644 index 000000000000..758d62df92e2 --- /dev/null +++ b/python/pystache/.gitignore @@ -0,0 +1,17 @@ +*.pyc +.DS_Store +# Tox support. See: http://pypi.python.org/pypi/tox +.tox +# Our tox runs convert the doctests in *.rst files to Python 3 prior to +# running tests. Ignore these temporary files. +*.temp2to3.rst +# The setup.py "prep" command converts *.md to *.temp.rst (via *.temp.md). +*.temp.md +*.temp.rst +# TextMate project file +*.tmproj +# Distribution-related folders and files. +build +dist +MANIFEST +pystache.egg-info diff --git a/python/pystache/.gitmodules b/python/pystache/.gitmodules new file mode 100644 index 000000000000..c55c8e5e3b76 --- /dev/null +++ b/python/pystache/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ext/spec"] + path = ext/spec + url = http://github.com/mustache/spec.git diff --git a/python/pystache/.travis.yml b/python/pystache/.travis.yml new file mode 100644 index 000000000000..00227053aae8 --- /dev/null +++ b/python/pystache/.travis.yml @@ -0,0 +1,14 @@ +language: python + +# Travis CI has no plans to support Jython and no longer supports Python 2.5. +python: + - 2.6 + - 2.7 + - 3.2 + - pypy + +script: + - python setup.py install + # Include the spec tests directory for Mustache spec tests and the + # project directory for doctests. + - pystache-test . ext/spec/specs diff --git a/python/pystache/HISTORY.md b/python/pystache/HISTORY.md new file mode 100644 index 000000000000..e5b7638aee9b --- /dev/null +++ b/python/pystache/HISTORY.md @@ -0,0 +1,169 @@ +History +======= + +**Note:** Official support for Python 2.4 will end with Pystache version 0.6.0. + +0.5.4 (2014-07-11) +------------------ + +- Bugfix: made test with filenames OS agnostic (issue \#162). + +0.5.3 (2012-11-03) +------------------ + +- Added ability to customize string coercion (e.g. to have None render as + `''`) (issue \#130). +- Added Renderer.render_name() to render a template by name (issue \#122). +- Added TemplateSpec.template_path to specify an absolute path to a + template (issue \#41). +- Added option of raising errors on missing tags/partials: + `Renderer(missing_tags='strict')` (issue \#110). +- Added support for finding and loading templates by file name in + addition to by template name (issue \#127). [xgecko] +- Added a `parse()` function that yields a printable, pre-compiled + parse tree. +- Added support for rendering pre-compiled templates. +- Added Python 3.3 to the list of supported versions. +- Added support for [PyPy](http://pypy.org/) (issue \#125). +- Added support for [Travis CI](http://travis-ci.org) (issue \#124). + [msabramo] +- Bugfix: `defaults.DELIMITERS` can now be changed at runtime (issue \#135). + [bennoleslie] +- Bugfix: exceptions raised from a property are no longer swallowed + when getting a key from a context stack (issue \#110). +- Bugfix: lambda section values can now return non-ascii, non-unicode + strings (issue \#118). +- Bugfix: allow `test_pystache.py` and `tox` to pass when run from a + downloaded sdist (i.e. without the spec test directory). +- Convert HISTORY and README files from reST to Markdown. +- More robust handling of byte strings in Python 3. +- Added Creative Commons license for David Phillips's logo. + +0.5.2 (2012-05-03) +------------------ + +- Added support for dot notation and version 1.1.2 of the spec (issue + \#99). [rbp] +- Missing partials now render as empty string per latest version of + spec (issue \#115). +- Bugfix: falsey values now coerced to strings using str(). +- Bugfix: lambda return values for sections no longer pushed onto + context stack (issue \#113). +- Bugfix: lists of lambdas for sections were not rendered (issue + \#114). + +0.5.1 (2012-04-24) +------------------ + +- Added support for Python 3.1 and 3.2. +- Added tox support to test multiple Python versions. +- Added test script entry point: pystache-test. +- Added \_\_version\_\_ package attribute. +- Test harness now supports both YAML and JSON forms of Mustache spec. +- Test harness no longer requires nose. + +0.5.0 (2012-04-03) +------------------ + +This version represents a major rewrite and refactoring of the code base +that also adds features and fixes many bugs. All functionality and +nearly all unit tests have been preserved. However, some backwards +incompatible changes to the API have been made. + +Below is a selection of some of the changes (not exhaustive). + +Highlights: + +- Pystache now passes all tests in version 1.0.3 of the [Mustache + spec](https://github.com/mustache/spec). [pvande] +- Removed View class: it is no longer necessary to subclass from View + or from any other class to create a view. +- Replaced Template with Renderer class: template rendering behavior + can be modified via the Renderer constructor or by setting + attributes on a Renderer instance. +- Added TemplateSpec class: template rendering can be specified on a + per-view basis by subclassing from TemplateSpec. +- Introduced separation of concerns and removed circular dependencies + (e.g. between Template and View classes, cf. [issue + \#13](https://github.com/defunkt/pystache/issues/13)). +- Unicode now used consistently throughout the rendering process. +- Expanded test coverage: nosetests now runs doctests and \~105 test + cases from the Mustache spec (increasing the number of tests from 56 + to \~315). +- Added a rudimentary benchmarking script to gauge performance while + refactoring. +- Extensive documentation added (e.g. docstrings). + +Other changes: + +- Added a command-line interface. [vrde] +- The main rendering class now accepts a custom partial loader (e.g. a + dictionary) and a custom escape function. +- Non-ascii characters in str strings are now supported while + rendering. +- Added string encoding, file encoding, and errors options for + decoding to unicode. +- Removed the output encoding option. +- Removed the use of markupsafe. + +Bug fixes: + +- Context values no longer processed as template strings. + [jakearchibald] +- Whitespace surrounding sections is no longer altered, per the spec. + [heliodor] +- Zeroes now render correctly when using PyPy. [alex] +- Multline comments now permitted. [fczuardi] +- Extensionless template files are now supported. +- Passing `**kwargs` to `Template()` no longer modifies the context. +- Passing `**kwargs` to `Template()` with no context no longer raises + an exception. + +0.4.1 (2012-03-25) +------------------ + +- Added support for Python 2.4. [wangtz, jvantuyl] + +0.4.0 (2011-01-12) +------------------ + +- Add support for nested contexts (within template and view) +- Add support for inverted lists +- Decoupled template loading + +0.3.1 (2010-05-07) +------------------ + +- Fix package + +0.3.0 (2010-05-03) +------------------ + +- View.template\_path can now hold a list of path +- Add {{& blah}} as an alias for {{{ blah }}} +- Higher Order Sections +- Inverted sections + +0.2.0 (2010-02-15) +------------------ + +- Bugfix: Methods returning False or None are not rendered +- Bugfix: Don't render an empty string when a tag's value is 0. + [enaeseth] +- Add support for using non-callables as View attributes. + [joshthecoder] +- Allow using View instances as attributes. [joshthecoder] +- Support for Unicode and non-ASCII-encoded bytestring output. + [enaeseth] +- Template file encoding awareness. [enaeseth] + +0.1.1 (2009-11-13) +------------------ + +- Ensure we're dealing with strings, always +- Tests can be run by executing the test file directly + +0.1.0 (2009-11-12) +------------------ + +- First release diff --git a/python/pystache/LICENSE b/python/pystache/LICENSE new file mode 100644 index 000000000000..42be9d646025 --- /dev/null +++ b/python/pystache/LICENSE @@ -0,0 +1,22 @@ +Copyright (C) 2012 Chris Jerdonek. All rights reserved. + +Copyright (c) 2009 Chris Wanstrath + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/python/pystache/MANIFEST.in b/python/pystache/MANIFEST.in new file mode 100644 index 000000000000..bdc64bf71861 --- /dev/null +++ b/python/pystache/MANIFEST.in @@ -0,0 +1,13 @@ +include README.md +include HISTORY.md +include LICENSE +include TODO.md +include setup_description.rst +include tox.ini +include test_pystache.py +# You cannot use package_data, for example, to include data files in a +# source distribution when using Distribute. +recursive-include pystache/tests *.mustache *.txt +# We deliberately exclude the gh/ directory because it contains copies +# of resources needed only for the web page hosted on GitHub (via the +# gh-pages branch). diff --git a/python/pystache/README.md b/python/pystache/README.md new file mode 100644 index 000000000000..54a96088b4ce --- /dev/null +++ b/python/pystache/README.md @@ -0,0 +1,276 @@ +Pystache +======== + + + + + + + + + + +![](http://defunkt.github.com/pystache/images/logo_phillips.png "mustachioed, monocled snake by David Phillips") + +![](https://secure.travis-ci.org/defunkt/pystache.png "Travis CI current build status") + +[Pystache](http://defunkt.github.com/pystache) is a Python +implementation of [Mustache](http://mustache.github.com/). Mustache is a +framework-agnostic, logic-free templating system inspired by +[ctemplate](http://code.google.com/p/google-ctemplate/) and +[et](http://www.ivan.fomichev.name/2008/05/erlang-template-engine-prototype.html). +Like ctemplate, Mustache "emphasizes separating logic from presentation: +it is impossible to embed application logic in this template language." + +The [mustache(5)](http://mustache.github.com/mustache.5.html) man page +provides a good introduction to Mustache's syntax. For a more complete +(and more current) description of Mustache's behavior, see the official +[Mustache spec](https://github.com/mustache/spec). + +Pystache is [semantically versioned](http://semver.org) and can be found +on [PyPI](http://pypi.python.org/pypi/pystache). This version of +Pystache passes all tests in [version +1.1.2](https://github.com/mustache/spec/tree/v1.1.2) of the spec. + + +Requirements +------------ + +Pystache is tested with-- + +- Python 2.4 (requires simplejson [version + 2.0.9](http://pypi.python.org/pypi/simplejson/2.0.9) or earlier) +- Python 2.5 (requires + [simplejson](http://pypi.python.org/pypi/simplejson/)) +- Python 2.6 +- Python 2.7 +- Python 3.1 +- Python 3.2 +- Python 3.3 +- [PyPy](http://pypy.org/) + +[Distribute](http://packages.python.org/distribute/) (the setuptools fork) +is recommended over [setuptools](http://pypi.python.org/pypi/setuptools), +and is required in some cases (e.g. for Python 3 support). +If you use [pip](http://www.pip-installer.org/), you probably already satisfy +this requirement. + +JSON support is needed only for the command-line interface and to run +the spec tests. We require simplejson for earlier versions of Python +since Python's [json](http://docs.python.org/library/json.html) module +was added in Python 2.6. + +For Python 2.4 we require an earlier version of simplejson since +simplejson stopped officially supporting Python 2.4 in simplejson +version 2.1.0. Earlier versions of simplejson can be installed manually, +as follows: + + pip install 'simplejson<2.1.0' + +Official support for Python 2.4 will end with Pystache version 0.6.0. + +Install It +---------- + + pip install pystache + +And test it-- + + pystache-test + +To install and test from source (e.g. from GitHub), see the Develop +section. + +Use It +------ + + >>> import pystache + >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'}) + Hi Mom! + +You can also create dedicated view classes to hold your view logic. + +Here's your view class (in .../examples/readme.py): + + class SayHello(object): + def to(self): + return "Pizza" + +Instantiating like so: + + >>> from pystache.tests.examples.readme import SayHello + >>> hello = SayHello() + +Then your template, say\_hello.mustache (by default in the same +directory as your class definition): + + Hello, {{to}}! + +Pull it together: + + >>> renderer = pystache.Renderer() + >>> print renderer.render(hello) + Hello, Pizza! + +For greater control over rendering (e.g. to specify a custom template +directory), use the `Renderer` class like above. One can pass attributes +to the Renderer class constructor or set them on a Renderer instance. To +customize template loading on a per-view basis, subclass `TemplateSpec`. +See the docstrings of the +[Renderer](https://github.com/defunkt/pystache/blob/master/pystache/renderer.py) +class and +[TemplateSpec](https://github.com/defunkt/pystache/blob/master/pystache/template_spec.py) +class for more information. + +You can also pre-parse a template: + + >>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}") + >>> print parsed + [u'Hey ', _SectionNode(key=u'who', index_begin=12, index_end=18, parsed=[_EscapeNode(key=u'.'), u'!'])] + +And then: + + >>> print renderer.render(parsed, {'who': 'Pops'}) + Hey Pops! + >>> print renderer.render(parsed, {'who': 'you'}) + Hey you! + +Python 3 +-------- + +Pystache has supported Python 3 since version 0.5.1. Pystache behaves +slightly differently between Python 2 and 3, as follows: + +- In Python 2, the default html-escape function `cgi.escape()` does + not escape single quotes. In Python 3, the default escape function + `html.escape()` does escape single quotes. +- In both Python 2 and 3, the string and file encodings default to + `sys.getdefaultencoding()`. However, this function can return + different values under Python 2 and 3, even when run from the same + system. Check your own system for the behavior on your system, or do + not rely on the defaults by passing in the encodings explicitly + (e.g. to the `Renderer` class). + +Unicode +------- + +This section describes how Pystache handles unicode, strings, and +encodings. + +Internally, Pystache uses [only unicode +strings](http://docs.python.org/howto/unicode.html#tips-for-writing-unicode-aware-programs) +(`str` in Python 3 and `unicode` in Python 2). For input, Pystache +accepts both unicode strings and byte strings (`bytes` in Python 3 and +`str` in Python 2). For output, Pystache's template rendering methods +return only unicode. + +Pystache's `Renderer` class supports a number of attributes to control +how Pystache converts byte strings to unicode on input. These include +the `file_encoding`, `string_encoding`, and `decode_errors` attributes. + +The `file_encoding` attribute is the encoding the renderer uses to +convert to unicode any files read from the file system. Similarly, +`string_encoding` is the encoding the renderer uses to convert any other +byte strings encountered during the rendering process into unicode (e.g. +context values that are encoded byte strings). + +The `decode_errors` attribute is what the renderer passes as the +`errors` argument to Python's built-in unicode-decoding function +(`str()` in Python 3 and `unicode()` in Python 2). The valid values for +this argument are `strict`, `ignore`, and `replace`. + +Each of these attributes can be set via the `Renderer` class's +constructor using a keyword argument of the same name. See the Renderer +class's docstrings for further details. In addition, the `file_encoding` +attribute can be controlled on a per-view basis by subclassing the +`TemplateSpec` class. When not specified explicitly, these attributes +default to values set in Pystache's `defaults` module. + +Develop +------- + +To test from a source distribution (without installing)-- + + python test_pystache.py + +To test Pystache with multiple versions of Python (with a single +command!), you can use [tox](http://pypi.python.org/pypi/tox): + + pip install 'virtualenv<1.8' # Version 1.8 dropped support for Python 2.4. + pip install 'tox<1.4' # Version 1.4 dropped support for Python 2.4. + tox + +If you do not have all Python versions listed in `tox.ini`-- + + tox -e py26,py32 # for example + +The source distribution tests also include doctests and tests from the +Mustache spec. To include tests from the Mustache spec in your test +runs: + + git submodule init + git submodule update + +The test harness parses the spec's (more human-readable) yaml files if +[PyYAML](http://pypi.python.org/pypi/PyYAML) is present. Otherwise, it +parses the json files. To install PyYAML-- + + pip install pyyaml + +To run a subset of the tests, you can use +[nose](http://somethingaboutorange.com/mrl/projects/nose/0.11.1/testing.html): + + pip install nose + nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present + +### Using Python 3 with Pystache from source + +Pystache is written in Python 2 and must be converted to Python 3 prior to +using it with Python 3. The installation process (and tox) do this +automatically. + +To convert the code to Python 3 manually (while using Python 3)-- + + python setup.py build + +This writes the converted code to a subdirectory called `build`. +By design, Python 3 builds +[cannot](https://bitbucket.org/tarek/distribute/issue/292/allow-use_2to3-with-python-2) +be created from Python 2. + +To convert the code without using setup.py, you can use +[2to3](http://docs.python.org/library/2to3.html) as follows (two steps)-- + + 2to3 --write --nobackups --no-diffs --doctests_only pystache + 2to3 --write --nobackups --no-diffs pystache + +This converts the code (and doctests) in place. + +To `import pystache` from a source distribution while using Python 3, be +sure that you are importing from a directory containing a converted +version of the code (e.g. from the `build` directory after converting), +and not from the original (unconverted) source directory. Otherwise, you will +get a syntax error. You can help prevent this by not running the Python +IDE from the project directory when importing Pystache while using Python 3. + + +Mailing List +------------ + +There is a [mailing list](http://librelist.com/browser/pystache/). Note +that there is a bit of a delay between posting a message and seeing it +appear in the mailing list archive. + +Credits +------- + + >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek' } + >>> print pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}", context) + Author: Chris Wanstrath + Maintainer: Chris Jerdonek + +Pystache logo by [David Phillips](http://davidphillips.us/) is licensed +under a [Creative Commons Attribution-ShareAlike 3.0 Unported +License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US). +![](http://i.creativecommons.org/l/by-sa/3.0/88x31.png "Creative +Commons Attribution-ShareAlike 3.0 Unported License") diff --git a/python/pystache/TODO.md b/python/pystache/TODO.md new file mode 100644 index 000000000000..cd824176577b --- /dev/null +++ b/python/pystache/TODO.md @@ -0,0 +1,16 @@ +TODO +==== + +In development branch: + +* Figure out a way to suppress center alignment of images in reST output. +* Add a unit test for the change made in 7ea8e7180c41. This is with regard + to not requiring spec tests when running tests from a downloaded sdist. +* End support for Python 2.4. +* Add Python 3.3 to tox file (after deprecating 2.4). +* Turn the benchmarking script at pystache/tests/benchmark.py into a command + in pystache/commands, or make it a subcommand of one of the existing + commands (i.e. using a command argument). +* Provide support for logging in at least one of the commands. +* Make sure command parsing to pystache-test doesn't break with Python 2.4 and earlier. +* Combine pystache-test with the main command. diff --git a/python/pystache/gh/images/logo_phillips.png b/python/pystache/gh/images/logo_phillips.png new file mode 100644 index 000000000000..749190136638 Binary files /dev/null and b/python/pystache/gh/images/logo_phillips.png differ diff --git a/python/pystache/pystache/__init__.py b/python/pystache/pystache/__init__.py new file mode 100644 index 000000000000..4cf24344e501 --- /dev/null +++ b/python/pystache/pystache/__init__.py @@ -0,0 +1,13 @@ + +""" +TODO: add a docstring. + +""" + +# We keep all initialization code in a separate module. + +from pystache.init import parse, render, Renderer, TemplateSpec + +__all__ = ['parse', 'render', 'Renderer', 'TemplateSpec'] + +__version__ = '0.5.4' # Also change in setup.py. diff --git a/python/pystache/pystache/commands/__init__.py b/python/pystache/pystache/commands/__init__.py new file mode 100644 index 000000000000..a0d386a38c98 --- /dev/null +++ b/python/pystache/pystache/commands/__init__.py @@ -0,0 +1,4 @@ +""" +TODO: add a docstring. + +""" diff --git a/python/pystache/pystache/commands/render.py b/python/pystache/pystache/commands/render.py new file mode 100644 index 000000000000..1a9c309d526d --- /dev/null +++ b/python/pystache/pystache/commands/render.py @@ -0,0 +1,95 @@ +# coding: utf-8 + +""" +This module provides command-line access to pystache. + +Run this script using the -h option for command-line help. + +""" + + +try: + import json +except: + # The json module is new in Python 2.6, whereas simplejson is + # compatible with earlier versions. + try: + import simplejson as json + except ImportError: + # Raise an error with a type different from ImportError as a hack around + # this issue: + # http://bugs.python.org/issue7559 + from sys import exc_info + ex_type, ex_value, tb = exc_info() + new_ex = Exception("%s: %s" % (ex_type.__name__, ex_value)) + raise new_ex.__class__, new_ex, tb + +# The optparse module is deprecated in Python 2.7 in favor of argparse. +# However, argparse is not available in Python 2.6 and earlier. +from optparse import OptionParser +import sys + +# We use absolute imports here to allow use of this script from its +# location in source control (e.g. for development purposes). +# Otherwise, the following error occurs: +# +# ValueError: Attempted relative import in non-package +# +from pystache.common import TemplateNotFoundError +from pystache.renderer import Renderer + + +USAGE = """\ +%prog [-h] template context + +Render a mustache template with the given context. + +positional arguments: + template A filename or template string. + context A filename or JSON string.""" + + +def parse_args(sys_argv, usage): + """ + Return an OptionParser for the script. + + """ + args = sys_argv[1:] + + parser = OptionParser(usage=usage) + options, args = parser.parse_args(args) + + template, context = args + + return template, context + + +# TODO: verify whether the setup() method's entry_points argument +# supports passing arguments to main: +# +# http://packages.python.org/distribute/setuptools.html#automatic-script-creation +# +def main(sys_argv=sys.argv): + template, context = parse_args(sys_argv, USAGE) + + if template.endswith('.mustache'): + template = template[:-9] + + renderer = Renderer() + + try: + template = renderer.load_template(template) + except TemplateNotFoundError: + pass + + try: + context = json.load(open(context)) + except IOError: + context = json.loads(context) + + rendered = renderer.render(template, context) + print rendered + + +if __name__=='__main__': + main() diff --git a/python/pystache/pystache/commands/test.py b/python/pystache/pystache/commands/test.py new file mode 100644 index 000000000000..0872453388b4 --- /dev/null +++ b/python/pystache/pystache/commands/test.py @@ -0,0 +1,18 @@ +# coding: utf-8 + +""" +This module provides a command to test pystache (unit tests, doctests, etc). + +""" + +import sys + +from pystache.tests.main import main as run_tests + + +def main(sys_argv=sys.argv): + run_tests(sys_argv=sys_argv) + + +if __name__=='__main__': + main() diff --git a/python/pystache/pystache/common.py b/python/pystache/pystache/common.py new file mode 100644 index 000000000000..fb266dd8b570 --- /dev/null +++ b/python/pystache/pystache/common.py @@ -0,0 +1,71 @@ +# coding: utf-8 + +""" +Exposes functionality needed throughout the project. + +""" + +from sys import version_info + +def _get_string_types(): + # TODO: come up with a better solution for this. One of the issues here + # is that in Python 3 there is no common base class for unicode strings + # and byte strings, and 2to3 seems to convert all of "str", "unicode", + # and "basestring" to Python 3's "str". + if version_info < (3, ): + return basestring + # The latter evaluates to "bytes" in Python 3 -- even after conversion by 2to3. + return (unicode, type(u"a".encode('utf-8'))) + + +_STRING_TYPES = _get_string_types() + + +def is_string(obj): + """ + Return whether the given object is a byte string or unicode string. + + This function is provided for compatibility with both Python 2 and 3 + when using 2to3. + + """ + return isinstance(obj, _STRING_TYPES) + + +# This function was designed to be portable across Python versions -- both +# with older versions and with Python 3 after applying 2to3. +def read(path): + """ + Return the contents of a text file as a byte string. + + """ + # Opening in binary mode is necessary for compatibility across Python + # 2 and 3. In both Python 2 and 3, open() defaults to opening files in + # text mode. However, in Python 2, open() returns file objects whose + # read() method returns byte strings (strings of type `str` in Python 2), + # whereas in Python 3, the file object returns unicode strings (strings + # of type `str` in Python 3). + f = open(path, 'rb') + # We avoid use of the with keyword for Python 2.4 support. + try: + return f.read() + finally: + f.close() + + +class MissingTags(object): + + """Contains the valid values for Renderer.missing_tags.""" + + ignore = 'ignore' + strict = 'strict' + + +class PystacheError(Exception): + """Base class for Pystache exceptions.""" + pass + + +class TemplateNotFoundError(PystacheError): + """An exception raised when a template is not found.""" + pass diff --git a/python/pystache/pystache/context.py b/python/pystache/pystache/context.py new file mode 100644 index 000000000000..671591609299 --- /dev/null +++ b/python/pystache/pystache/context.py @@ -0,0 +1,342 @@ +# coding: utf-8 + +""" +Exposes a ContextStack class. + +The Mustache spec makes a special distinction between two types of context +stack elements: hashes and objects. For the purposes of interpreting the +spec, we define these categories mutually exclusively as follows: + + (1) Hash: an item whose type is a subclass of dict. + + (2) Object: an item that is neither a hash nor an instance of a + built-in type. + +""" + +from pystache.common import PystacheError + + +# This equals '__builtin__' in Python 2 and 'builtins' in Python 3. +_BUILTIN_MODULE = type(0).__module__ + + +# We use this private global variable as a return value to represent a key +# not being found on lookup. This lets us distinguish between the case +# of a key's value being None with the case of a key not being found -- +# without having to rely on exceptions (e.g. KeyError) for flow control. +# +# TODO: eliminate the need for a private global variable, e.g. by using the +# preferred Python approach of "easier to ask for forgiveness than permission": +# http://docs.python.org/glossary.html#term-eafp +class NotFound(object): + pass +_NOT_FOUND = NotFound() + + +def _get_value(context, key): + """ + Retrieve a key's value from a context item. + + Returns _NOT_FOUND if the key does not exist. + + The ContextStack.get() docstring documents this function's intended behavior. + + """ + if isinstance(context, dict): + # Then we consider the argument a "hash" for the purposes of the spec. + # + # We do a membership test to avoid using exceptions for flow control + # (e.g. catching KeyError). + if key in context: + return context[key] + elif type(context).__module__ != _BUILTIN_MODULE: + # Then we consider the argument an "object" for the purposes of + # the spec. + # + # The elif test above lets us avoid treating instances of built-in + # types like integers and strings as objects (cf. issue #81). + # Instances of user-defined classes on the other hand, for example, + # are considered objects by the test above. + try: + attr = getattr(context, key) + except AttributeError: + # TODO: distinguish the case of the attribute not existing from + # an AttributeError being raised by the call to the attribute. + # See the following issue for implementation ideas: + # http://bugs.python.org/issue7559 + pass + else: + # TODO: consider using EAFP here instead. + # http://docs.python.org/glossary.html#term-eafp + if callable(attr): + return attr() + return attr + + return _NOT_FOUND + + +class KeyNotFoundError(PystacheError): + + """ + An exception raised when a key is not found in a context stack. + + """ + + def __init__(self, key, details): + self.key = key + self.details = details + + def __str__(self): + return "Key %s not found: %s" % (repr(self.key), self.details) + + +class ContextStack(object): + + """ + Provides dictionary-like access to a stack of zero or more items. + + Instances of this class are meant to act as the rendering context + when rendering Mustache templates in accordance with mustache(5) + and the Mustache spec. + + Instances encapsulate a private stack of hashes, objects, and built-in + type instances. Querying the stack for the value of a key queries + the items in the stack in order from last-added objects to first + (last in, first out). + + Caution: this class does not currently support recursive nesting in + that items in the stack cannot themselves be ContextStack instances. + + See the docstrings of the methods of this class for more details. + + """ + + # We reserve keyword arguments for future options (e.g. a "strict=True" + # option for enabling a strict mode). + def __init__(self, *items): + """ + Construct an instance, and initialize the private stack. + + The *items arguments are the items with which to populate the + initial stack. Items in the argument list are added to the + stack in order so that, in particular, items at the end of + the argument list are queried first when querying the stack. + + Caution: items should not themselves be ContextStack instances, as + recursive nesting does not behave as one might expect. + + """ + self._stack = list(items) + + def __repr__(self): + """ + Return a string representation of the instance. + + For example-- + + >>> context = ContextStack({'alpha': 'abc'}, {'numeric': 123}) + >>> repr(context) + "ContextStack({'alpha': 'abc'}, {'numeric': 123})" + + """ + return "%s%s" % (self.__class__.__name__, tuple(self._stack)) + + @staticmethod + def create(*context, **kwargs): + """ + Build a ContextStack instance from a sequence of context-like items. + + This factory-style method is more general than the ContextStack class's + constructor in that, unlike the constructor, the argument list + can itself contain ContextStack instances. + + Here is an example illustrating various aspects of this method: + + >>> obj1 = {'animal': 'cat', 'vegetable': 'carrot', 'mineral': 'copper'} + >>> obj2 = ContextStack({'vegetable': 'spinach', 'mineral': 'silver'}) + >>> + >>> context = ContextStack.create(obj1, None, obj2, mineral='gold') + >>> + >>> context.get('animal') + 'cat' + >>> context.get('vegetable') + 'spinach' + >>> context.get('mineral') + 'gold' + + Arguments: + + *context: zero or more dictionaries, ContextStack instances, or objects + with which to populate the initial context stack. None + arguments will be skipped. Items in the *context list are + added to the stack in order so that later items in the argument + list take precedence over earlier items. This behavior is the + same as the constructor's. + + **kwargs: additional key-value data to add to the context stack. + As these arguments appear after all items in the *context list, + in the case of key conflicts these values take precedence over + all items in the *context list. This behavior is the same as + the constructor's. + + """ + items = context + + context = ContextStack() + + for item in items: + if item is None: + continue + if isinstance(item, ContextStack): + context._stack.extend(item._stack) + else: + context.push(item) + + if kwargs: + context.push(kwargs) + + return context + + # TODO: add more unit tests for this. + # TODO: update the docstring for dotted names. + def get(self, name): + """ + Resolve a dotted name against the current context stack. + + This function follows the rules outlined in the section of the + spec regarding tag interpolation. This function returns the value + as is and does not coerce the return value to a string. + + Arguments: + + name: a dotted or non-dotted name. + + default: the value to return if name resolution fails at any point. + Defaults to the empty string per the Mustache spec. + + This method queries items in the stack in order from last-added + objects to first (last in, first out). The value returned is + the value of the key in the first item that contains the key. + If the key is not found in any item in the stack, then the default + value is returned. The default value defaults to None. + + In accordance with the spec, this method queries items in the + stack for a key differently depending on whether the item is a + hash, object, or neither (as defined in the module docstring): + + (1) Hash: if the item is a hash, then the key's value is the + dictionary value of the key. If the dictionary doesn't contain + the key, then the key is considered not found. + + (2) Object: if the item is an an object, then the method looks for + an attribute with the same name as the key. If an attribute + with that name exists, the value of the attribute is returned. + If the attribute is callable, however (i.e. if the attribute + is a method), then the attribute is called with no arguments + and that value is returned. If there is no attribute with + the same name as the key, then the key is considered not found. + + (3) Neither: if the item is neither a hash nor an object, then + the key is considered not found. + + *Caution*: + + Callables are handled differently depending on whether they are + dictionary values, as in (1) above, or attributes, as in (2). + The former are returned as-is, while the latter are first + called and that value returned. + + Here is an example to illustrate: + + >>> def greet(): + ... return "Hi Bob!" + >>> + >>> class Greeter(object): + ... greet = None + >>> + >>> dct = {'greet': greet} + >>> obj = Greeter() + >>> obj.greet = greet + >>> + >>> dct['greet'] is obj.greet + True + >>> ContextStack(dct).get('greet') #doctest: +ELLIPSIS + + >>> ContextStack(obj).get('greet') + 'Hi Bob!' + + TODO: explain the rationale for this difference in treatment. + + """ + if name == '.': + try: + return self.top() + except IndexError: + raise KeyNotFoundError(".", "empty context stack") + + parts = name.split('.') + + try: + result = self._get_simple(parts[0]) + except KeyNotFoundError: + raise KeyNotFoundError(name, "first part") + + for part in parts[1:]: + # The full context stack is not used to resolve the remaining parts. + # From the spec-- + # + # 5) If any name parts were retained in step 1, each should be + # resolved against a context stack containing only the result + # from the former resolution. If any part fails resolution, the + # result should be considered falsey, and should interpolate as + # the empty string. + # + # TODO: make sure we have a test case for the above point. + result = _get_value(result, part) + # TODO: consider using EAFP here instead. + # http://docs.python.org/glossary.html#term-eafp + if result is _NOT_FOUND: + raise KeyNotFoundError(name, "missing %s" % repr(part)) + + return result + + def _get_simple(self, name): + """ + Query the stack for a non-dotted name. + + """ + for item in reversed(self._stack): + result = _get_value(item, name) + if result is not _NOT_FOUND: + return result + + raise KeyNotFoundError(name, "part missing") + + def push(self, item): + """ + Push an item onto the stack. + + """ + self._stack.append(item) + + def pop(self): + """ + Pop an item off of the stack, and return it. + + """ + return self._stack.pop() + + def top(self): + """ + Return the item last added to the stack. + + """ + return self._stack[-1] + + def copy(self): + """ + Return a copy of this instance. + + """ + return ContextStack(*self._stack) diff --git a/python/pystache/pystache/defaults.py b/python/pystache/pystache/defaults.py new file mode 100644 index 000000000000..bcfdf4cd3a33 --- /dev/null +++ b/python/pystache/pystache/defaults.py @@ -0,0 +1,65 @@ +# coding: utf-8 + +""" +This module provides a central location for defining default behavior. + +Throughout the package, these defaults take effect only when the user +does not otherwise specify a value. + +""" + +try: + # Python 3.2 adds html.escape() and deprecates cgi.escape(). + from html import escape +except ImportError: + from cgi import escape + +import os +import sys + +from pystache.common import MissingTags + + +# How to handle encoding errors when decoding strings from str to unicode. +# +# This value is passed as the "errors" argument to Python's built-in +# unicode() function: +# +# http://docs.python.org/library/functions.html#unicode +# +DECODE_ERRORS = 'strict' + +# The name of the encoding to use when converting to unicode any strings of +# type str encountered during the rendering process. +STRING_ENCODING = sys.getdefaultencoding() + +# The name of the encoding to use when converting file contents to unicode. +# This default takes precedence over the STRING_ENCODING default for +# strings that arise from files. +FILE_ENCODING = sys.getdefaultencoding() + +# The delimiters to start with when parsing. +DELIMITERS = (u'{{', u'}}') + +# How to handle missing tags when rendering a template. +MISSING_TAGS = MissingTags.ignore + +# The starting list of directories in which to search for templates when +# loading a template by file name. +SEARCH_DIRS = [os.curdir] # i.e. ['.'] + +# The escape function to apply to strings that require escaping when +# rendering templates (e.g. for tags enclosed in double braces). +# Only unicode strings will be passed to this function. +# +# The quote=True argument causes double but not single quotes to be escaped +# in Python 3.1 and earlier, and both double and single quotes to be +# escaped in Python 3.2 and later: +# +# http://docs.python.org/library/cgi.html#cgi.escape +# http://docs.python.org/dev/library/html.html#html.escape +# +TAG_ESCAPE = lambda u: escape(u, quote=True) + +# The default template extension, without the leading dot. +TEMPLATE_EXTENSION = 'mustache' diff --git a/python/pystache/pystache/init.py b/python/pystache/pystache/init.py new file mode 100644 index 000000000000..38bb1f5a0e18 --- /dev/null +++ b/python/pystache/pystache/init.py @@ -0,0 +1,19 @@ +# encoding: utf-8 + +""" +This module contains the initialization logic called by __init__.py. + +""" + +from pystache.parser import parse +from pystache.renderer import Renderer +from pystache.template_spec import TemplateSpec + + +def render(template, context=None, **kwargs): + """ + Return the given template string rendered using the given context. + + """ + renderer = Renderer() + return renderer.render(template, context, **kwargs) diff --git a/python/pystache/pystache/loader.py b/python/pystache/pystache/loader.py new file mode 100644 index 000000000000..d4a7e5310ff4 --- /dev/null +++ b/python/pystache/pystache/loader.py @@ -0,0 +1,170 @@ +# coding: utf-8 + +""" +This module provides a Loader class for locating and reading templates. + +""" + +import os +import sys + +from pystache import common +from pystache import defaults +from pystache.locator import Locator + + +# We make a function so that the current defaults take effect. +# TODO: revisit whether this is necessary. + +def _make_to_unicode(): + def to_unicode(s, encoding=None): + """ + Raises a TypeError exception if the given string is already unicode. + + """ + if encoding is None: + encoding = defaults.STRING_ENCODING + return unicode(s, encoding, defaults.DECODE_ERRORS) + return to_unicode + + +class Loader(object): + + """ + Loads the template associated to a name or user-defined object. + + All load_*() methods return the template as a unicode string. + + """ + + def __init__(self, file_encoding=None, extension=None, to_unicode=None, + search_dirs=None): + """ + Construct a template loader instance. + + Arguments: + + extension: the template file extension, without the leading dot. + Pass False for no extension (e.g. to use extensionless template + files). Defaults to the package default. + + file_encoding: the name of the encoding to use when converting file + contents to unicode. Defaults to the package default. + + search_dirs: the list of directories in which to search when loading + a template by name or file name. Defaults to the package default. + + to_unicode: the function to use when converting strings of type + str to unicode. The function should have the signature: + + to_unicode(s, encoding=None) + + It should accept a string of type str and an optional encoding + name and return a string of type unicode. Defaults to calling + Python's built-in function unicode() using the package string + encoding and decode errors defaults. + + """ + if extension is None: + extension = defaults.TEMPLATE_EXTENSION + + if file_encoding is None: + file_encoding = defaults.FILE_ENCODING + + if search_dirs is None: + search_dirs = defaults.SEARCH_DIRS + + if to_unicode is None: + to_unicode = _make_to_unicode() + + self.extension = extension + self.file_encoding = file_encoding + # TODO: unit test setting this attribute. + self.search_dirs = search_dirs + self.to_unicode = to_unicode + + def _make_locator(self): + return Locator(extension=self.extension) + + def unicode(self, s, encoding=None): + """ + Convert a string to unicode using the given encoding, and return it. + + This function uses the underlying to_unicode attribute. + + Arguments: + + s: a basestring instance to convert to unicode. Unlike Python's + built-in unicode() function, it is okay to pass unicode strings + to this function. (Passing a unicode string to Python's unicode() + with the encoding argument throws the error, "TypeError: decoding + Unicode is not supported.") + + encoding: the encoding to pass to the to_unicode attribute. + Defaults to None. + + """ + if isinstance(s, unicode): + return unicode(s) + + return self.to_unicode(s, encoding) + + def read(self, path, encoding=None): + """ + Read the template at the given path, and return it as a unicode string. + + """ + b = common.read(path) + + if encoding is None: + encoding = self.file_encoding + + return self.unicode(b, encoding) + + def load_file(self, file_name): + """ + Find and return the template with the given file name. + + Arguments: + + file_name: the file name of the template. + + """ + locator = self._make_locator() + + path = locator.find_file(file_name, self.search_dirs) + + return self.read(path) + + def load_name(self, name): + """ + Find and return the template with the given template name. + + Arguments: + + name: the name of the template. + + """ + locator = self._make_locator() + + path = locator.find_name(name, self.search_dirs) + + return self.read(path) + + # TODO: unit-test this method. + def load_object(self, obj): + """ + Find and return the template associated to the given object. + + Arguments: + + obj: an instance of a user-defined class. + + search_dirs: the list of directories in which to search. + + """ + locator = self._make_locator() + + path = locator.find_object(obj, self.search_dirs) + + return self.read(path) diff --git a/python/pystache/pystache/locator.py b/python/pystache/pystache/locator.py new file mode 100644 index 000000000000..30c5b01e0106 --- /dev/null +++ b/python/pystache/pystache/locator.py @@ -0,0 +1,171 @@ +# coding: utf-8 + +""" +This module provides a Locator class for finding template files. + +""" + +import os +import re +import sys + +from pystache.common import TemplateNotFoundError +from pystache import defaults + + +class Locator(object): + + def __init__(self, extension=None): + """ + Construct a template locator. + + Arguments: + + extension: the template file extension, without the leading dot. + Pass False for no extension (e.g. to use extensionless template + files). Defaults to the package default. + + """ + if extension is None: + extension = defaults.TEMPLATE_EXTENSION + + self.template_extension = extension + + def get_object_directory(self, obj): + """ + Return the directory containing an object's defining class. + + Returns None if there is no such directory, for example if the + class was defined in an interactive Python session, or in a + doctest that appears in a text file (rather than a Python file). + + """ + if not hasattr(obj, '__module__'): + return None + + module = sys.modules[obj.__module__] + + if not hasattr(module, '__file__'): + # TODO: add a unit test for this case. + return None + + path = module.__file__ + + return os.path.dirname(path) + + def make_template_name(self, obj): + """ + Return the canonical template name for an object instance. + + This method converts Python-style class names (PEP 8's recommended + CamelCase, aka CapWords) to lower_case_with_underscords. Here + is an example with code: + + >>> class HelloWorld(object): + ... pass + >>> hi = HelloWorld() + >>> + >>> locator = Locator() + >>> locator.make_template_name(hi) + 'hello_world' + + """ + template_name = obj.__class__.__name__ + + def repl(match): + return '_' + match.group(0).lower() + + return re.sub('[A-Z]', repl, template_name)[1:] + + def make_file_name(self, template_name, template_extension=None): + """ + Generate and return the file name for the given template name. + + Arguments: + + template_extension: defaults to the instance's extension. + + """ + file_name = template_name + + if template_extension is None: + template_extension = self.template_extension + + if template_extension is not False: + file_name += os.path.extsep + template_extension + + return file_name + + def _find_path(self, search_dirs, file_name): + """ + Search for the given file, and return the path. + + Returns None if the file is not found. + + """ + for dir_path in search_dirs: + file_path = os.path.join(dir_path, file_name) + if os.path.exists(file_path): + return file_path + + return None + + def _find_path_required(self, search_dirs, file_name): + """ + Return the path to a template with the given file name. + + """ + path = self._find_path(search_dirs, file_name) + + if path is None: + raise TemplateNotFoundError('File %s not found in dirs: %s' % + (repr(file_name), repr(search_dirs))) + + return path + + def find_file(self, file_name, search_dirs): + """ + Return the path to a template with the given file name. + + Arguments: + + file_name: the file name of the template. + + search_dirs: the list of directories in which to search. + + """ + return self._find_path_required(search_dirs, file_name) + + def find_name(self, template_name, search_dirs): + """ + Return the path to a template with the given name. + + Arguments: + + template_name: the name of the template. + + search_dirs: the list of directories in which to search. + + """ + file_name = self.make_file_name(template_name) + + return self._find_path_required(search_dirs, file_name) + + def find_object(self, obj, search_dirs, file_name=None): + """ + Return the path to a template associated with the given object. + + """ + if file_name is None: + # TODO: should we define a make_file_name() method? + template_name = self.make_template_name(obj) + file_name = self.make_file_name(template_name) + + dir_path = self.get_object_directory(obj) + + if dir_path is not None: + search_dirs = [dir_path] + search_dirs + + path = self._find_path_required(search_dirs, file_name) + + return path diff --git a/python/pystache/pystache/parsed.py b/python/pystache/pystache/parsed.py new file mode 100644 index 000000000000..372d96c6664f --- /dev/null +++ b/python/pystache/pystache/parsed.py @@ -0,0 +1,50 @@ +# coding: utf-8 + +""" +Exposes a class that represents a parsed (or compiled) template. + +""" + + +class ParsedTemplate(object): + + """ + Represents a parsed or compiled template. + + An instance wraps a list of unicode strings and node objects. A node + object must have a `render(engine, stack)` method that accepts a + RenderEngine instance and a ContextStack instance and returns a unicode + string. + + """ + + def __init__(self): + self._parse_tree = [] + + def __repr__(self): + return repr(self._parse_tree) + + def add(self, node): + """ + Arguments: + + node: a unicode string or node object instance. See the class + docstring for information. + + """ + self._parse_tree.append(node) + + def render(self, engine, context): + """ + Returns: a string of type unicode. + + """ + # We avoid use of the ternary operator for Python 2.4 support. + def get_unicode(node): + if type(node) is unicode: + return node + return node.render(engine, context) + parts = map(get_unicode, self._parse_tree) + s = ''.join(parts) + + return unicode(s) diff --git a/python/pystache/pystache/parser.py b/python/pystache/pystache/parser.py new file mode 100644 index 000000000000..9a4fba235b07 --- /dev/null +++ b/python/pystache/pystache/parser.py @@ -0,0 +1,378 @@ +# coding: utf-8 + +""" +Exposes a parse() function to parse template strings. + +""" + +import re + +from pystache import defaults +from pystache.parsed import ParsedTemplate + + +END_OF_LINE_CHARACTERS = [u'\r', u'\n'] +NON_BLANK_RE = re.compile(ur'^(.)', re.M) + + +# TODO: add some unit tests for this. +# TODO: add a test case that checks for spurious spaces. +# TODO: add test cases for delimiters. +def parse(template, delimiters=None): + """ + Parse a unicode template string and return a ParsedTemplate instance. + + Arguments: + + template: a unicode template string. + + delimiters: a 2-tuple of delimiters. Defaults to the package default. + + Examples: + + >>> parsed = parse(u"Hey {{#who}}{{name}}!{{/who}}") + >>> print str(parsed).replace('u', '') # This is a hack to get the test to pass both in Python 2 and 3. + ['Hey ', _SectionNode(key='who', index_begin=12, index_end=21, parsed=[_EscapeNode(key='name'), '!'])] + + """ + if type(template) is not unicode: + raise Exception("Template is not unicode: %s" % type(template)) + parser = _Parser(delimiters) + return parser.parse(template) + + +def _compile_template_re(delimiters): + """ + Return a regular expression object (re.RegexObject) instance. + + """ + # The possible tag type characters following the opening tag, + # excluding "=" and "{". + tag_types = "!>&/#^" + + # TODO: are we following this in the spec? + # + # The tag's content MUST be a non-whitespace character sequence + # NOT containing the current closing delimiter. + # + tag = r""" + (?P[\ \t]*) + %(otag)s \s* + (?: + (?P=) \s* (?P.+?) \s* = | + (?P{) \s* (?P.+?) \s* } | + (?P[%(tag_types)s]?) \s* (?P[\s\S]+?) + ) + \s* %(ctag)s + """ % {'tag_types': tag_types, 'otag': re.escape(delimiters[0]), 'ctag': re.escape(delimiters[1])} + + return re.compile(tag, re.VERBOSE) + + +class ParsingError(Exception): + + pass + + +## Node types + +def _format(obj, exclude=None): + if exclude is None: + exclude = [] + exclude.append('key') + attrs = obj.__dict__ + names = list(set(attrs.keys()) - set(exclude)) + names.sort() + names.insert(0, 'key') + args = ["%s=%s" % (name, repr(attrs[name])) for name in names] + return "%s(%s)" % (obj.__class__.__name__, ", ".join(args)) + + +class _CommentNode(object): + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + return u'' + + +class _ChangeNode(object): + + def __init__(self, delimiters): + self.delimiters = delimiters + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + return u'' + + +class _EscapeNode(object): + + def __init__(self, key): + self.key = key + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + s = engine.fetch_string(context, self.key) + return engine.escape(s) + + +class _LiteralNode(object): + + def __init__(self, key): + self.key = key + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + s = engine.fetch_string(context, self.key) + return engine.literal(s) + + +class _PartialNode(object): + + def __init__(self, key, indent): + self.key = key + self.indent = indent + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + template = engine.resolve_partial(self.key) + # Indent before rendering. + template = re.sub(NON_BLANK_RE, self.indent + ur'\1', template) + + return engine.render(template, context) + + +class _InvertedNode(object): + + def __init__(self, key, parsed_section): + self.key = key + self.parsed_section = parsed_section + + def __repr__(self): + return _format(self) + + def render(self, engine, context): + # TODO: is there a bug because we are not using the same + # logic as in fetch_string()? + data = engine.resolve_context(context, self.key) + # Note that lambdas are considered truthy for inverted sections + # per the spec. + if data: + return u'' + return self.parsed_section.render(engine, context) + + +class _SectionNode(object): + + # TODO: the template_ and parsed_template_ arguments don't both seem + # to be necessary. Can we remove one of them? For example, if + # callable(data) is True, then the initial parsed_template isn't used. + def __init__(self, key, parsed, delimiters, template, index_begin, index_end): + self.delimiters = delimiters + self.key = key + self.parsed = parsed + self.template = template + self.index_begin = index_begin + self.index_end = index_end + + def __repr__(self): + return _format(self, exclude=['delimiters', 'template']) + + def render(self, engine, context): + values = engine.fetch_section_data(context, self.key) + + parts = [] + for val in values: + if callable(val): + # Lambdas special case section rendering and bypass pushing + # the data value onto the context stack. From the spec-- + # + # When used as the data value for a Section tag, the + # lambda MUST be treatable as an arity 1 function, and + # invoked as such (passing a String containing the + # unprocessed section contents). The returned value + # MUST be rendered against the current delimiters, then + # interpolated in place of the section. + # + # Also see-- + # + # https://github.com/defunkt/pystache/issues/113 + # + # TODO: should we check the arity? + val = val(self.template[self.index_begin:self.index_end]) + val = engine._render_value(val, context, delimiters=self.delimiters) + parts.append(val) + continue + + context.push(val) + parts.append(self.parsed.render(engine, context)) + context.pop() + + return unicode(''.join(parts)) + + +class _Parser(object): + + _delimiters = None + _template_re = None + + def __init__(self, delimiters=None): + if delimiters is None: + delimiters = defaults.DELIMITERS + + self._delimiters = delimiters + + def _compile_delimiters(self): + self._template_re = _compile_template_re(self._delimiters) + + def _change_delimiters(self, delimiters): + self._delimiters = delimiters + self._compile_delimiters() + + def parse(self, template): + """ + Parse a template string starting at some index. + + This method uses the current tag delimiter. + + Arguments: + + template: a unicode string that is the template to parse. + + index: the index at which to start parsing. + + Returns: + + a ParsedTemplate instance. + + """ + self._compile_delimiters() + + start_index = 0 + content_end_index, parsed_section, section_key = None, None, None + parsed_template = ParsedTemplate() + + states = [] + + while True: + match = self._template_re.search(template, start_index) + + if match is None: + break + + match_index = match.start() + end_index = match.end() + + matches = match.groupdict() + + # Normalize the matches dictionary. + if matches['change'] is not None: + matches.update(tag='=', tag_key=matches['delims']) + elif matches['raw'] is not None: + matches.update(tag='&', tag_key=matches['raw_name']) + + tag_type = matches['tag'] + tag_key = matches['tag_key'] + leading_whitespace = matches['whitespace'] + + # Standalone (non-interpolation) tags consume the entire line, + # both leading whitespace and trailing newline. + did_tag_begin_line = match_index == 0 or template[match_index - 1] in END_OF_LINE_CHARACTERS + did_tag_end_line = end_index == len(template) or template[end_index] in END_OF_LINE_CHARACTERS + is_tag_interpolating = tag_type in ['', '&'] + + if did_tag_begin_line and did_tag_end_line and not is_tag_interpolating: + if end_index < len(template): + end_index += template[end_index] == '\r' and 1 or 0 + if end_index < len(template): + end_index += template[end_index] == '\n' and 1 or 0 + elif leading_whitespace: + match_index += len(leading_whitespace) + leading_whitespace = '' + + # Avoid adding spurious empty strings to the parse tree. + if start_index != match_index: + parsed_template.add(template[start_index:match_index]) + + start_index = end_index + + if tag_type in ('#', '^'): + # Cache current state. + state = (tag_type, end_index, section_key, parsed_template) + states.append(state) + + # Initialize new state + section_key, parsed_template = tag_key, ParsedTemplate() + continue + + if tag_type == '/': + if tag_key != section_key: + raise ParsingError("Section end tag mismatch: %s != %s" % (tag_key, section_key)) + + # Restore previous state with newly found section data. + parsed_section = parsed_template + + (tag_type, section_start_index, section_key, parsed_template) = states.pop() + node = self._make_section_node(template, tag_type, tag_key, parsed_section, + section_start_index, match_index) + + else: + node = self._make_interpolation_node(tag_type, tag_key, leading_whitespace) + + parsed_template.add(node) + + # Avoid adding spurious empty strings to the parse tree. + if start_index != len(template): + parsed_template.add(template[start_index:]) + + return parsed_template + + def _make_interpolation_node(self, tag_type, tag_key, leading_whitespace): + """ + Create and return a non-section node for the parse tree. + + """ + # TODO: switch to using a dictionary instead of a bunch of ifs and elifs. + if tag_type == '!': + return _CommentNode() + + if tag_type == '=': + delimiters = tag_key.split() + self._change_delimiters(delimiters) + return _ChangeNode(delimiters) + + if tag_type == '': + return _EscapeNode(tag_key) + + if tag_type == '&': + return _LiteralNode(tag_key) + + if tag_type == '>': + return _PartialNode(tag_key, leading_whitespace) + + raise Exception("Invalid symbol for interpolation tag: %s" % repr(tag_type)) + + def _make_section_node(self, template, tag_type, tag_key, parsed_section, + section_start_index, section_end_index): + """ + Create and return a section node for the parse tree. + + """ + if tag_type == '#': + return _SectionNode(tag_key, parsed_section, self._delimiters, + template, section_start_index, section_end_index) + + if tag_type == '^': + return _InvertedNode(tag_key, parsed_section) + + raise Exception("Invalid symbol for section tag: %s" % repr(tag_type)) diff --git a/python/pystache/pystache/renderengine.py b/python/pystache/pystache/renderengine.py new file mode 100644 index 000000000000..c797b1765a5a --- /dev/null +++ b/python/pystache/pystache/renderengine.py @@ -0,0 +1,181 @@ +# coding: utf-8 + +""" +Defines a class responsible for rendering logic. + +""" + +import re + +from pystache.common import is_string +from pystache.parser import parse + + +def context_get(stack, name): + """ + Find and return a name from a ContextStack instance. + + """ + return stack.get(name) + + +class RenderEngine(object): + + """ + Provides a render() method. + + This class is meant only for internal use. + + As a rule, the code in this class operates on unicode strings where + possible rather than, say, strings of type str or markupsafe.Markup. + This means that strings obtained from "external" sources like partials + and variable tag values are immediately converted to unicode (or + escaped and converted to unicode) before being operated on further. + This makes maintaining, reasoning about, and testing the correctness + of the code much simpler. In particular, it keeps the implementation + of this class independent of the API details of one (or possibly more) + unicode subclasses (e.g. markupsafe.Markup). + + """ + + # TODO: it would probably be better for the constructor to accept + # and set as an attribute a single RenderResolver instance + # that encapsulates the customizable aspects of converting + # strings and resolving partials and names from context. + def __init__(self, literal=None, escape=None, resolve_context=None, + resolve_partial=None, to_str=None): + """ + Arguments: + + literal: the function used to convert unescaped variable tag + values to unicode, e.g. the value corresponding to a tag + "{{{name}}}". The function should accept a string of type + str or unicode (or a subclass) and return a string of type + unicode (but not a proper subclass of unicode). + This class will only pass basestring instances to this + function. For example, it will call str() on integer variable + values prior to passing them to this function. + + escape: the function used to escape and convert variable tag + values to unicode, e.g. the value corresponding to a tag + "{{name}}". The function should obey the same properties + described above for the "literal" function argument. + This function should take care to convert any str + arguments to unicode just as the literal function should, as + this class will not pass tag values to literal prior to passing + them to this function. This allows for more flexibility, + for example using a custom escape function that handles + incoming strings of type markupsafe.Markup differently + from plain unicode strings. + + resolve_context: the function to call to resolve a name against + a context stack. The function should accept two positional + arguments: a ContextStack instance and a name to resolve. + + resolve_partial: the function to call when loading a partial. + The function should accept a template name string and return a + template string of type unicode (not a subclass). + + to_str: a function that accepts an object and returns a string (e.g. + the built-in function str). This function is used for string + coercion whenever a string is required (e.g. for converting None + or 0 to a string). + + """ + self.escape = escape + self.literal = literal + self.resolve_context = resolve_context + self.resolve_partial = resolve_partial + self.to_str = to_str + + # TODO: Rename context to stack throughout this module. + + # From the spec: + # + # When used as the data value for an Interpolation tag, the lambda + # MUST be treatable as an arity 0 function, and invoked as such. + # The returned value MUST be rendered against the default delimiters, + # then interpolated in place of the lambda. + # + def fetch_string(self, context, name): + """ + Get a value from the given context as a basestring instance. + + """ + val = self.resolve_context(context, name) + + if callable(val): + # Return because _render_value() is already a string. + return self._render_value(val(), context) + + if not is_string(val): + return self.to_str(val) + + return val + + def fetch_section_data(self, context, name): + """ + Fetch the value of a section as a list. + + """ + data = self.resolve_context(context, name) + + # From the spec: + # + # If the data is not of a list type, it is coerced into a list + # as follows: if the data is truthy (e.g. `!!data == true`), + # use a single-element list containing the data, otherwise use + # an empty list. + # + if not data: + data = [] + else: + # The least brittle way to determine whether something + # supports iteration is by trying to call iter() on it: + # + # http://docs.python.org/library/functions.html#iter + # + # It is not sufficient, for example, to check whether the item + # implements __iter__ () (the iteration protocol). There is + # also __getitem__() (the sequence protocol). In Python 2, + # strings do not implement __iter__(), but in Python 3 they do. + try: + iter(data) + except TypeError: + # Then the value does not support iteration. + data = [data] + else: + if is_string(data) or isinstance(data, dict): + # Do not treat strings and dicts (which are iterable) as lists. + data = [data] + # Otherwise, treat the value as a list. + + return data + + def _render_value(self, val, context, delimiters=None): + """ + Render an arbitrary value. + + """ + if not is_string(val): + # In case the template is an integer, for example. + val = self.to_str(val) + if type(val) is not unicode: + val = self.literal(val) + return self.render(val, context, delimiters) + + def render(self, template, context_stack, delimiters=None): + """ + Render a unicode template string, and return as unicode. + + Arguments: + + template: a template string of type unicode (but not a proper + subclass of unicode). + + context_stack: a ContextStack instance. + + """ + parsed_template = parse(template, delimiters) + + return parsed_template.render(self, context_stack) diff --git a/python/pystache/pystache/renderer.py b/python/pystache/pystache/renderer.py new file mode 100644 index 000000000000..ff6a90c64b4d --- /dev/null +++ b/python/pystache/pystache/renderer.py @@ -0,0 +1,460 @@ +# coding: utf-8 + +""" +This module provides a Renderer class to render templates. + +""" + +import sys + +from pystache import defaults +from pystache.common import TemplateNotFoundError, MissingTags, is_string +from pystache.context import ContextStack, KeyNotFoundError +from pystache.loader import Loader +from pystache.parsed import ParsedTemplate +from pystache.renderengine import context_get, RenderEngine +from pystache.specloader import SpecLoader +from pystache.template_spec import TemplateSpec + + +class Renderer(object): + + """ + A class for rendering mustache templates. + + This class supports several rendering options which are described in + the constructor's docstring. Other behavior can be customized by + subclassing this class. + + For example, one can pass a string-string dictionary to the constructor + to bypass loading partials from the file system: + + >>> partials = {'partial': 'Hello, {{thing}}!'} + >>> renderer = Renderer(partials=partials) + >>> # We apply print to make the test work in Python 3 after 2to3. + >>> print renderer.render('{{>partial}}', {'thing': 'world'}) + Hello, world! + + To customize string coercion (e.g. to render False values as ''), one can + subclass this class. For example: + + class MyRenderer(Renderer): + def str_coerce(self, val): + if not val: + return '' + else: + return str(val) + + """ + + def __init__(self, file_encoding=None, string_encoding=None, + decode_errors=None, search_dirs=None, file_extension=None, + escape=None, partials=None, missing_tags=None): + """ + Construct an instance. + + Arguments: + + file_encoding: the name of the encoding to use by default when + reading template files. All templates are converted to unicode + prior to parsing. Defaults to the package default. + + string_encoding: the name of the encoding to use when converting + to unicode any byte strings (type str in Python 2) encountered + during the rendering process. This name will be passed as the + encoding argument to the built-in function unicode(). + Defaults to the package default. + + decode_errors: the string to pass as the errors argument to the + built-in function unicode() when converting byte strings to + unicode. Defaults to the package default. + + search_dirs: the list of directories in which to search when + loading a template by name or file name. If given a string, + the method interprets the string as a single directory. + Defaults to the package default. + + file_extension: the template file extension. Pass False for no + extension (i.e. to use extensionless template files). + Defaults to the package default. + + partials: an object (e.g. a dictionary) for custom partial loading + during the rendering process. + The object should have a get() method that accepts a string + and returns the corresponding template as a string, preferably + as a unicode string. If there is no template with that name, + the get() method should either return None (as dict.get() does) + or raise an exception. + If this argument is None, the rendering process will use + the normal procedure of locating and reading templates from + the file system -- using relevant instance attributes like + search_dirs, file_encoding, etc. + + escape: the function used to escape variable tag values when + rendering a template. The function should accept a unicode + string (or subclass of unicode) and return an escaped string + that is again unicode (or a subclass of unicode). + This function need not handle strings of type `str` because + this class will only pass it unicode strings. The constructor + assigns this function to the constructed instance's escape() + method. + To disable escaping entirely, one can pass `lambda u: u` + as the escape function, for example. One may also wish to + consider using markupsafe's escape function: markupsafe.escape(). + This argument defaults to the package default. + + missing_tags: a string specifying how to handle missing tags. + If 'strict', an error is raised on a missing tag. If 'ignore', + the value of the tag is the empty string. Defaults to the + package default. + + """ + if decode_errors is None: + decode_errors = defaults.DECODE_ERRORS + + if escape is None: + escape = defaults.TAG_ESCAPE + + if file_encoding is None: + file_encoding = defaults.FILE_ENCODING + + if file_extension is None: + file_extension = defaults.TEMPLATE_EXTENSION + + if missing_tags is None: + missing_tags = defaults.MISSING_TAGS + + if search_dirs is None: + search_dirs = defaults.SEARCH_DIRS + + if string_encoding is None: + string_encoding = defaults.STRING_ENCODING + + if isinstance(search_dirs, basestring): + search_dirs = [search_dirs] + + self._context = None + self.decode_errors = decode_errors + self.escape = escape + self.file_encoding = file_encoding + self.file_extension = file_extension + self.missing_tags = missing_tags + self.partials = partials + self.search_dirs = search_dirs + self.string_encoding = string_encoding + + # This is an experimental way of giving views access to the current context. + # TODO: consider another approach of not giving access via a property, + # but instead letting the caller pass the initial context to the + # main render() method by reference. This approach would probably + # be less likely to be misused. + @property + def context(self): + """ + Return the current rendering context [experimental]. + + """ + return self._context + + # We could not choose str() as the name because 2to3 renames the unicode() + # method of this class to str(). + def str_coerce(self, val): + """ + Coerce a non-string value to a string. + + This method is called whenever a non-string is encountered during the + rendering process when a string is needed (e.g. if a context value + for string interpolation is not a string). To customize string + coercion, you can override this method. + + """ + return str(val) + + def _to_unicode_soft(self, s): + """ + Convert a basestring to unicode, preserving any unicode subclass. + + """ + # We type-check to avoid "TypeError: decoding Unicode is not supported". + # We avoid the Python ternary operator for Python 2.4 support. + if isinstance(s, unicode): + return s + return self.unicode(s) + + def _to_unicode_hard(self, s): + """ + Convert a basestring to a string with type unicode (not subclass). + + """ + return unicode(self._to_unicode_soft(s)) + + def _escape_to_unicode(self, s): + """ + Convert a basestring to unicode (preserving any unicode subclass), and escape it. + + Returns a unicode string (not subclass). + + """ + return unicode(self.escape(self._to_unicode_soft(s))) + + def unicode(self, b, encoding=None): + """ + Convert a byte string to unicode, using string_encoding and decode_errors. + + Arguments: + + b: a byte string. + + encoding: the name of an encoding. Defaults to the string_encoding + attribute for this instance. + + Raises: + + TypeError: Because this method calls Python's built-in unicode() + function, this method raises the following exception if the + given string is already unicode: + + TypeError: decoding Unicode is not supported + + """ + if encoding is None: + encoding = self.string_encoding + + # TODO: Wrap UnicodeDecodeErrors with a message about setting + # the string_encoding and decode_errors attributes. + return unicode(b, encoding, self.decode_errors) + + def _make_loader(self): + """ + Create a Loader instance using current attributes. + + """ + return Loader(file_encoding=self.file_encoding, extension=self.file_extension, + to_unicode=self.unicode, search_dirs=self.search_dirs) + + def _make_load_template(self): + """ + Return a function that loads a template by name. + + """ + loader = self._make_loader() + + def load_template(template_name): + return loader.load_name(template_name) + + return load_template + + def _make_load_partial(self): + """ + Return a function that loads a partial by name. + + """ + if self.partials is None: + return self._make_load_template() + + # Otherwise, create a function from the custom partial loader. + partials = self.partials + + def load_partial(name): + # TODO: consider using EAFP here instead. + # http://docs.python.org/glossary.html#term-eafp + # This would mean requiring that the custom partial loader + # raise a KeyError on name not found. + template = partials.get(name) + if template is None: + raise TemplateNotFoundError("Name %s not found in partials: %s" % + (repr(name), type(partials))) + + # RenderEngine requires that the return value be unicode. + return self._to_unicode_hard(template) + + return load_partial + + def _is_missing_tags_strict(self): + """ + Return whether missing_tags is set to strict. + + """ + val = self.missing_tags + + if val == MissingTags.strict: + return True + elif val == MissingTags.ignore: + return False + + raise Exception("Unsupported 'missing_tags' value: %s" % repr(val)) + + def _make_resolve_partial(self): + """ + Return the resolve_partial function to pass to RenderEngine.__init__(). + + """ + load_partial = self._make_load_partial() + + if self._is_missing_tags_strict(): + return load_partial + # Otherwise, ignore missing tags. + + def resolve_partial(name): + try: + return load_partial(name) + except TemplateNotFoundError: + return u'' + + return resolve_partial + + def _make_resolve_context(self): + """ + Return the resolve_context function to pass to RenderEngine.__init__(). + + """ + if self._is_missing_tags_strict(): + return context_get + # Otherwise, ignore missing tags. + + def resolve_context(stack, name): + try: + return context_get(stack, name) + except KeyNotFoundError: + return u'' + + return resolve_context + + def _make_render_engine(self): + """ + Return a RenderEngine instance for rendering. + + """ + resolve_context = self._make_resolve_context() + resolve_partial = self._make_resolve_partial() + + engine = RenderEngine(literal=self._to_unicode_hard, + escape=self._escape_to_unicode, + resolve_context=resolve_context, + resolve_partial=resolve_partial, + to_str=self.str_coerce) + return engine + + # TODO: add unit tests for this method. + def load_template(self, template_name): + """ + Load a template by name from the file system. + + """ + load_template = self._make_load_template() + return load_template(template_name) + + def _render_object(self, obj, *context, **kwargs): + """ + Render the template associated with the given object. + + """ + loader = self._make_loader() + + # TODO: consider an approach that does not require using an if + # block here. For example, perhaps this class's loader can be + # a SpecLoader in all cases, and the SpecLoader instance can + # check the object's type. Or perhaps Loader and SpecLoader + # can be refactored to implement the same interface. + if isinstance(obj, TemplateSpec): + loader = SpecLoader(loader) + template = loader.load(obj) + else: + template = loader.load_object(obj) + + context = [obj] + list(context) + + return self._render_string(template, *context, **kwargs) + + def render_name(self, template_name, *context, **kwargs): + """ + Render the template with the given name using the given context. + + See the render() docstring for more information. + + """ + loader = self._make_loader() + template = loader.load_name(template_name) + return self._render_string(template, *context, **kwargs) + + def render_path(self, template_path, *context, **kwargs): + """ + Render the template at the given path using the given context. + + Read the render() docstring for more information. + + """ + loader = self._make_loader() + template = loader.read(template_path) + + return self._render_string(template, *context, **kwargs) + + def _render_string(self, template, *context, **kwargs): + """ + Render the given template string using the given context. + + """ + # RenderEngine.render() requires that the template string be unicode. + template = self._to_unicode_hard(template) + + render_func = lambda engine, stack: engine.render(template, stack) + + return self._render_final(render_func, *context, **kwargs) + + # All calls to render() should end here because it prepares the + # context stack correctly. + def _render_final(self, render_func, *context, **kwargs): + """ + Arguments: + + render_func: a function that accepts a RenderEngine and ContextStack + instance and returns a template rendering as a unicode string. + + """ + stack = ContextStack.create(*context, **kwargs) + self._context = stack + + engine = self._make_render_engine() + + return render_func(engine, stack) + + def render(self, template, *context, **kwargs): + """ + Render the given template string, view template, or parsed template. + + Returns a unicode string. + + Prior to rendering, this method will convert a template that is a + byte string (type str in Python 2) to unicode using the string_encoding + and decode_errors attributes. See the constructor docstring for + more information. + + Arguments: + + template: a template string that is unicode or a byte string, + a ParsedTemplate instance, or another object instance. In the + final case, the function first looks for the template associated + to the object by calling this class's get_associated_template() + method. The rendering process also uses the passed object as + the first element of the context stack when rendering. + + *context: zero or more dictionaries, ContextStack instances, or objects + with which to populate the initial context stack. None + arguments are skipped. Items in the *context list are added to + the context stack in order so that later items in the argument + list take precedence over earlier items. + + **kwargs: additional key-value data to add to the context stack. + As these arguments appear after all items in the *context list, + in the case of key conflicts these values take precedence over + all items in the *context list. + + """ + if is_string(template): + return self._render_string(template, *context, **kwargs) + if isinstance(template, ParsedTemplate): + render_func = lambda engine, stack: template.render(engine, stack) + return self._render_final(render_func, *context, **kwargs) + # Otherwise, we assume the template is an object. + + return self._render_object(template, *context, **kwargs) diff --git a/python/pystache/pystache/specloader.py b/python/pystache/pystache/specloader.py new file mode 100644 index 000000000000..3a77d4c5288c --- /dev/null +++ b/python/pystache/pystache/specloader.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" +This module supports customized (aka special or specified) template loading. + +""" + +import os.path + +from pystache.loader import Loader + + +# TODO: add test cases for this class. +class SpecLoader(object): + + """ + Supports loading custom-specified templates (from TemplateSpec instances). + + """ + + def __init__(self, loader=None): + if loader is None: + loader = Loader() + + self.loader = loader + + def _find_relative(self, spec): + """ + Return the path to the template as a relative (dir, file_name) pair. + + The directory returned is relative to the directory containing the + class definition of the given object. The method returns None for + this directory if the directory is unknown without first searching + the search directories. + + """ + if spec.template_rel_path is not None: + return os.path.split(spec.template_rel_path) + # Otherwise, determine the file name separately. + + locator = self.loader._make_locator() + + # We do not use the ternary operator for Python 2.4 support. + if spec.template_name is not None: + template_name = spec.template_name + else: + template_name = locator.make_template_name(spec) + + file_name = locator.make_file_name(template_name, spec.template_extension) + + return (spec.template_rel_directory, file_name) + + def _find(self, spec): + """ + Find and return the path to the template associated to the instance. + + """ + if spec.template_path is not None: + return spec.template_path + + dir_path, file_name = self._find_relative(spec) + + locator = self.loader._make_locator() + + if dir_path is None: + # Then we need to search for the path. + path = locator.find_object(spec, self.loader.search_dirs, file_name=file_name) + else: + obj_dir = locator.get_object_directory(spec) + path = os.path.join(obj_dir, dir_path, file_name) + + return path + + def load(self, spec): + """ + Find and return the template associated to a TemplateSpec instance. + + Returns the template as a unicode string. + + Arguments: + + spec: a TemplateSpec instance. + + """ + if spec.template is not None: + return self.loader.unicode(spec.template, spec.template_encoding) + + path = self._find(spec) + + return self.loader.read(path, spec.template_encoding) diff --git a/python/pystache/pystache/template_spec.py b/python/pystache/pystache/template_spec.py new file mode 100644 index 000000000000..9e9f454c19d5 --- /dev/null +++ b/python/pystache/pystache/template_spec.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" +Provides a class to customize template information on a per-view basis. + +To customize template properties for a particular view, create that view +from a class that subclasses TemplateSpec. The "spec" in TemplateSpec +stands for "special" or "specified" template information. + +""" + +class TemplateSpec(object): + + """ + A mixin or interface for specifying custom template information. + + The "spec" in TemplateSpec can be taken to mean that the template + information is either "specified" or "special." + + A view should subclass this class only if customized template loading + is needed. The following attributes allow one to customize/override + template information on a per view basis. A None value means to use + default behavior for that value and perform no customization. All + attributes are initialized to None. + + Attributes: + + template: the template as a string. + + template_encoding: the encoding used by the template. + + template_extension: the template file extension. Defaults to "mustache". + Pass False for no extension (i.e. extensionless template files). + + template_name: the name of the template. + + template_path: absolute path to the template. + + template_rel_directory: the directory containing the template file, + relative to the directory containing the module defining the class. + + template_rel_path: the path to the template file, relative to the + directory containing the module defining the class. + + """ + + template = None + template_encoding = None + template_extension = None + template_name = None + template_path = None + template_rel_directory = None + template_rel_path = None diff --git a/python/pystache/setup.py b/python/pystache/setup.py new file mode 100644 index 000000000000..0d99aae8fb77 --- /dev/null +++ b/python/pystache/setup.py @@ -0,0 +1,413 @@ +#!/usr/bin/env python +# coding: utf-8 + +""" +This script supports publishing Pystache to PyPI. + +This docstring contains instructions to Pystache maintainers on how +to release a new version of Pystache. + +(1) Prepare the release. + +Make sure the code is finalized and merged to master. Bump the version +number in setup.py, update the release date in the HISTORY file, etc. + +Generate the reStructuredText long_description using-- + + $ python setup.py prep + +and be sure this new version is checked in. You must have pandoc installed +to do this step: + + http://johnmacfarlane.net/pandoc/ + +It helps to review this auto-generated file on GitHub prior to uploading +because the long description will be sent to PyPI and appear there after +publishing. PyPI attempts to convert this string to HTML before displaying +it on the PyPI project page. If PyPI finds any issues, it will render it +instead as plain-text, which we do not want. + +To check in advance that PyPI will accept and parse the reST file as HTML, +you can use the rst2html program installed by the docutils package +(http://docutils.sourceforge.net/). To install docutils: + + $ pip install docutils + +To check the file, run the following command and confirm that it reports +no warnings: + + $ python setup.py --long-description | rst2html.py -v --no-raw > out.html + +See here for more information: + + http://docs.python.org/distutils/uploading.html#pypi-package-display + +(2) Push to PyPI. To release a new version of Pystache to PyPI-- + + http://pypi.python.org/pypi/pystache + +create a PyPI user account if you do not already have one. The user account +will need permissions to push to PyPI. A current "Package Index Owner" of +Pystache can grant you those permissions. + +When you have permissions, run the following: + + python setup.py publish + +If you get an error like the following-- + + Upload failed (401): You must be identified to edit package information + +then add a file called .pyirc to your home directory with the following +contents: + + [server-login] + username: + password: + +as described here, for example: + + http://docs.python.org/release/2.5.2/dist/pypirc.html + +(3) Tag the release on GitHub. Here are some commands for tagging. + +List current tags: + + git tag -l -n3 + +Create an annotated tag: + + git tag -a -m "Version 0.5.1" "v0.5.1" + +Push a tag to GitHub: + + git push --tags defunkt v0.5.1 + +""" + +import os +import shutil +import sys + + +py_version = sys.version_info + +# distutils does not seem to support the following setup() arguments. +# It displays a UserWarning when setup() is passed those options: +# +# * entry_points +# * install_requires +# +# distribute works with Python 2.3.5 and above: +# +# http://packages.python.org/distribute/setuptools.html#building-and-distributing-packages-with-distribute +# +if py_version < (2, 3, 5): + # TODO: this might not work yet. + import distutils as dist + from distutils import core + setup = core.setup +else: + import setuptools as dist + setup = dist.setup + + +VERSION = '0.5.4' # Also change in pystache/__init__.py. + +FILE_ENCODING = 'utf-8' + +README_PATH = 'README.md' +HISTORY_PATH = 'HISTORY.md' +LICENSE_PATH = 'LICENSE' + +RST_DESCRIPTION_PATH = 'setup_description.rst' + +TEMP_EXTENSION = '.temp' + +PREP_COMMAND = 'prep' + +CLASSIFIERS = ( + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.1', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: Implementation :: PyPy', +) + +# Comments in reST begin with two dots. +RST_LONG_DESCRIPTION_INTRO = """\ +.. Do not edit this file. This file is auto-generated for PyPI by setup.py +.. using pandoc, so edits should go in the source files rather than here. +""" + + +def read(path): + """ + Read and return the contents of a text file as a unicode string. + + """ + # This function implementation was chosen to be compatible across Python 2/3. + f = open(path, 'rb') + # We avoid use of the with keyword for Python 2.4 support. + try: + b = f.read() + finally: + f.close() + + return b.decode(FILE_ENCODING) + + +def write(u, path): + """ + Write a unicode string to a file (as utf-8). + + """ + print("writing to: %s" % path) + # This function implementation was chosen to be compatible across Python 2/3. + f = open(path, "wb") + try: + b = u.encode(FILE_ENCODING) + f.write(b) + finally: + f.close() + + +def make_temp_path(path, new_ext=None): + """ + Arguments: + + new_ext: the new file extension, including the leading dot. + Defaults to preserving the existing file extension. + + """ + root, ext = os.path.splitext(path) + if new_ext is None: + new_ext = ext + temp_path = root + TEMP_EXTENSION + new_ext + return temp_path + + +def strip_html_comments(text): + """Strip HTML comments from a unicode string.""" + lines = text.splitlines(True) # preserve line endings. + + # Remove HTML comments (which we only allow to take a special form). + new_lines = filter(lambda line: not line.startswith("%s" % (md_path, rst_temp_path, + command)) + + if os.path.exists(rst_temp_path): + os.remove(rst_temp_path) + + os.system(command) + + if not os.path.exists(rst_temp_path): + s = ("Error running: %s\n" + " Did you install pandoc per the %s docstring?" % (command, + __file__)) + sys.exit(s) + + return read(rst_temp_path) + + +# The long_description needs to be formatted as reStructuredText. +# See the following for more information: +# +# http://docs.python.org/distutils/setupscript.html#additional-meta-data +# http://docs.python.org/distutils/uploading.html#pypi-package-display +# +def make_long_description(): + """ + Generate the reST long_description for setup() from source files. + + Returns the generated long_description as a unicode string. + + """ + readme_path = README_PATH + + # Remove our HTML comments because PyPI does not allow it. + # See the setup.py docstring for more info on this. + readme_md = strip_html_comments(read(readme_path)) + history_md = strip_html_comments(read(HISTORY_PATH)) + license_md = """\ +License +======= + +""" + read(LICENSE_PATH) + + sections = [readme_md, history_md, license_md] + md_description = '\n\n'.join(sections) + + # Write the combined Markdown file to a temp path. + md_ext = os.path.splitext(readme_path)[1] + md_description_path = make_temp_path(RST_DESCRIPTION_PATH, new_ext=md_ext) + write(md_description, md_description_path) + + rst_temp_path = make_temp_path(RST_DESCRIPTION_PATH) + long_description = convert_md_to_rst(md_path=md_description_path, + rst_temp_path=rst_temp_path) + + return "\n".join([RST_LONG_DESCRIPTION_INTRO, long_description]) + + +def prep(): + """Update the reST long_description file.""" + long_description = make_long_description() + write(long_description, RST_DESCRIPTION_PATH) + + +def publish(): + """Publish this package to PyPI (aka "the Cheeseshop").""" + long_description = make_long_description() + + if long_description != read(RST_DESCRIPTION_PATH): + print("""\ +Description file not up-to-date: %s +Run the following command and commit the changes-- + + python setup.py %s +""" % (RST_DESCRIPTION_PATH, PREP_COMMAND)) + sys.exit() + + print("Description up-to-date: %s" % RST_DESCRIPTION_PATH) + + answer = raw_input("Are you sure you want to publish to PyPI (yes/no)?") + + if answer != "yes": + exit("Aborted: nothing published") + + os.system('python setup.py sdist upload') + + +# We use the package simplejson for older Python versions since Python +# does not contain the module json before 2.6: +# +# http://docs.python.org/library/json.html +# +# Moreover, simplejson stopped officially support for Python 2.4 in version 2.1.0: +# +# https://github.com/simplejson/simplejson/blob/master/CHANGES.txt +# +requires = [] +if py_version < (2, 5): + requires.append('simplejson<2.1') +elif py_version < (2, 6): + requires.append('simplejson') + +INSTALL_REQUIRES = requires + +# TODO: decide whether to use find_packages() instead. I'm not sure that +# find_packages() is available with distutils, for example. +PACKAGES = [ + 'pystache', + 'pystache.commands', + # The following packages are only for testing. + 'pystache.tests', + 'pystache.tests.data', + 'pystache.tests.data.locator', + 'pystache.tests.examples', +] + + +# The purpose of this function is to follow the guidance suggested here: +# +# http://packages.python.org/distribute/python3.html#note-on-compatibility-with-setuptools +# +# The guidance is for better compatibility when using setuptools (e.g. with +# earlier versions of Python 2) instead of Distribute, because of new +# keyword arguments to setup() that setuptools may not recognize. +def get_extra_args(): + """ + Return a dictionary of extra args to pass to setup(). + + """ + extra = {} + # TODO: it might be more correct to check whether we are using + # Distribute instead of setuptools, since use_2to3 doesn't take + # effect when using Python 2, even when using Distribute. + if py_version >= (3, ): + # Causes 2to3 to be run during the build step. + extra['use_2to3'] = True + + return extra + + +def main(sys_argv): + + # TODO: use the logging module instead of printing. + # TODO: include the following in a verbose mode. + sys.stderr.write("pystache: using: version %s of %s\n" % (repr(dist.__version__), repr(dist))) + + command = sys_argv[-1] + + if command == 'publish': + publish() + sys.exit() + elif command == PREP_COMMAND: + prep() + sys.exit() + + long_description = read(RST_DESCRIPTION_PATH) + template_files = ['*.mustache', '*.txt'] + extra_args = get_extra_args() + + setup(name='pystache', + version=VERSION, + license='MIT', + description='Mustache for Python', + long_description=long_description, + author='Chris Wanstrath', + author_email='chris@ozmm.org', + maintainer='Chris Jerdonek', + maintainer_email='chris.jerdonek@gmail.com', + url='http://github.com/defunkt/pystache', + install_requires=INSTALL_REQUIRES, + packages=PACKAGES, + package_data = { + # Include template files so tests can be run. + 'pystache.tests.data': template_files, + 'pystache.tests.data.locator': template_files, + 'pystache.tests.examples': template_files, + }, + entry_points = { + 'console_scripts': [ + 'pystache=pystache.commands.render:main', + 'pystache-test=pystache.commands.test:main', + ], + }, + classifiers = CLASSIFIERS, + **extra_args + ) + + +if __name__=='__main__': + main(sys.argv) diff --git a/python/pystache/setup_description.rst b/python/pystache/setup_description.rst new file mode 100644 index 000000000000..724c45723313 --- /dev/null +++ b/python/pystache/setup_description.rst @@ -0,0 +1,513 @@ +.. Do not edit this file. This file is auto-generated for PyPI by setup.py +.. using pandoc, so edits should go in the source files rather than here. + +Pystache +======== + +.. figure:: http://defunkt.github.com/pystache/images/logo_phillips.png + :alt: mustachioed, monocled snake by David Phillips + +.. figure:: https://secure.travis-ci.org/defunkt/pystache.png + :alt: Travis CI current build status + +`Pystache `__ is a Python +implementation of `Mustache `__. Mustache +is a framework-agnostic, logic-free templating system inspired by +`ctemplate `__ and +`et `__. +Like ctemplate, Mustache "emphasizes separating logic from presentation: +it is impossible to embed application logic in this template language." + +The `mustache(5) `__ man +page provides a good introduction to Mustache's syntax. For a more +complete (and more current) description of Mustache's behavior, see the +official `Mustache spec `__. + +Pystache is `semantically versioned `__ and can be +found on `PyPI `__. This version +of Pystache passes all tests in `version +1.1.2 `__ of the spec. + +Requirements +------------ + +Pystache is tested with-- + +- Python 2.4 (requires simplejson `version + 2.0.9 `__ or earlier) +- Python 2.5 (requires + `simplejson `__) +- Python 2.6 +- Python 2.7 +- Python 3.1 +- Python 3.2 +- Python 3.3 +- `PyPy `__ + +`Distribute `__ (the setuptools +fork) is recommended over +`setuptools `__, and is required +in some cases (e.g. for Python 3 support). If you use +`pip `__, you probably already satisfy +this requirement. + +JSON support is needed only for the command-line interface and to run +the spec tests. We require simplejson for earlier versions of Python +since Python's `json `__ +module was added in Python 2.6. + +For Python 2.4 we require an earlier version of simplejson since +simplejson stopped officially supporting Python 2.4 in simplejson +version 2.1.0. Earlier versions of simplejson can be installed manually, +as follows: + +:: + + pip install 'simplejson<2.1.0' + +Official support for Python 2.4 will end with Pystache version 0.6.0. + +Install It +---------- + +:: + + pip install pystache + +And test it-- + +:: + + pystache-test + +To install and test from source (e.g. from GitHub), see the Develop +section. + +Use It +------ + +:: + + >>> import pystache + >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'}) + Hi Mom! + +You can also create dedicated view classes to hold your view logic. + +Here's your view class (in .../examples/readme.py): + +:: + + class SayHello(object): + def to(self): + return "Pizza" + +Instantiating like so: + +:: + + >>> from pystache.tests.examples.readme import SayHello + >>> hello = SayHello() + +Then your template, say\_hello.mustache (by default in the same +directory as your class definition): + +:: + + Hello, {{to}}! + +Pull it together: + +:: + + >>> renderer = pystache.Renderer() + >>> print renderer.render(hello) + Hello, Pizza! + +For greater control over rendering (e.g. to specify a custom template +directory), use the ``Renderer`` class like above. One can pass +attributes to the Renderer class constructor or set them on a Renderer +instance. To customize template loading on a per-view basis, subclass +``TemplateSpec``. See the docstrings of the +`Renderer `__ +class and +`TemplateSpec `__ +class for more information. + +You can also pre-parse a template: + +:: + + >>> parsed = pystache.parse(u"Hey {{#who}}{{.}}!{{/who}}") + >>> print parsed + [u'Hey ', _SectionNode(key=u'who', index_begin=12, index_end=18, parsed=[_EscapeNode(key=u'.'), u'!'])] + +And then: + +:: + + >>> print renderer.render(parsed, {'who': 'Pops'}) + Hey Pops! + >>> print renderer.render(parsed, {'who': 'you'}) + Hey you! + +Python 3 +-------- + +Pystache has supported Python 3 since version 0.5.1. Pystache behaves +slightly differently between Python 2 and 3, as follows: + +- In Python 2, the default html-escape function ``cgi.escape()`` does + not escape single quotes. In Python 3, the default escape function + ``html.escape()`` does escape single quotes. +- In both Python 2 and 3, the string and file encodings default to + ``sys.getdefaultencoding()``. However, this function can return + different values under Python 2 and 3, even when run from the same + system. Check your own system for the behavior on your system, or do + not rely on the defaults by passing in the encodings explicitly (e.g. + to the ``Renderer`` class). + +Unicode +------- + +This section describes how Pystache handles unicode, strings, and +encodings. + +Internally, Pystache uses `only unicode +strings `__ +(``str`` in Python 3 and ``unicode`` in Python 2). For input, Pystache +accepts both unicode strings and byte strings (``bytes`` in Python 3 and +``str`` in Python 2). For output, Pystache's template rendering methods +return only unicode. + +Pystache's ``Renderer`` class supports a number of attributes to control +how Pystache converts byte strings to unicode on input. These include +the ``file_encoding``, ``string_encoding``, and ``decode_errors`` +attributes. + +The ``file_encoding`` attribute is the encoding the renderer uses to +convert to unicode any files read from the file system. Similarly, +``string_encoding`` is the encoding the renderer uses to convert any +other byte strings encountered during the rendering process into unicode +(e.g. context values that are encoded byte strings). + +The ``decode_errors`` attribute is what the renderer passes as the +``errors`` argument to Python's built-in unicode-decoding function +(``str()`` in Python 3 and ``unicode()`` in Python 2). The valid values +for this argument are ``strict``, ``ignore``, and ``replace``. + +Each of these attributes can be set via the ``Renderer`` class's +constructor using a keyword argument of the same name. See the Renderer +class's docstrings for further details. In addition, the +``file_encoding`` attribute can be controlled on a per-view basis by +subclassing the ``TemplateSpec`` class. When not specified explicitly, +these attributes default to values set in Pystache's ``defaults`` +module. + +Develop +------- + +To test from a source distribution (without installing)-- + +:: + + python test_pystache.py + +To test Pystache with multiple versions of Python (with a single +command!), you can use `tox `__: + +:: + + pip install 'virtualenv<1.8' # Version 1.8 dropped support for Python 2.4. + pip install 'tox<1.4' # Version 1.4 dropped support for Python 2.4. + tox + +If you do not have all Python versions listed in ``tox.ini``-- + +:: + + tox -e py26,py32 # for example + +The source distribution tests also include doctests and tests from the +Mustache spec. To include tests from the Mustache spec in your test +runs: + +:: + + git submodule init + git submodule update + +The test harness parses the spec's (more human-readable) yaml files if +`PyYAML `__ is present. Otherwise, +it parses the json files. To install PyYAML-- + +:: + + pip install pyyaml + +To run a subset of the tests, you can use +`nose `__: + +:: + + pip install nose + nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present + +Using Python 3 with Pystache from source +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Pystache is written in Python 2 and must be converted to Python 3 prior +to using it with Python 3. The installation process (and tox) do this +automatically. + +To convert the code to Python 3 manually (while using Python 3)-- + +:: + + python setup.py build + +This writes the converted code to a subdirectory called ``build``. By +design, Python 3 builds +`cannot `__ +be created from Python 2. + +To convert the code without using setup.py, you can use +`2to3 `__ as follows (two +steps)-- + +:: + + 2to3 --write --nobackups --no-diffs --doctests_only pystache + 2to3 --write --nobackups --no-diffs pystache + +This converts the code (and doctests) in place. + +To ``import pystache`` from a source distribution while using Python 3, +be sure that you are importing from a directory containing a converted +version of the code (e.g. from the ``build`` directory after +converting), and not from the original (unconverted) source directory. +Otherwise, you will get a syntax error. You can help prevent this by not +running the Python IDE from the project directory when importing +Pystache while using Python 3. + +Mailing List +------------ + +There is a `mailing list `__. +Note that there is a bit of a delay between posting a message and seeing +it appear in the mailing list archive. + +Credits +------- + +:: + + >>> context = { 'author': 'Chris Wanstrath', 'maintainer': 'Chris Jerdonek' } + >>> print pystache.render("Author: {{author}}\nMaintainer: {{maintainer}}", context) + Author: Chris Wanstrath + Maintainer: Chris Jerdonek + +Pystache logo by `David Phillips `__ is +licensed under a `Creative Commons Attribution-ShareAlike 3.0 Unported +License `__. +|image0| + +History +======= + +**Note:** Official support for Python 2.4 will end with Pystache version +0.6.0. + +0.5.4 (2014-07-11) +------------------ + +- Bugfix: made test with filenames OS agnostic (issue #162). + +0.5.3 (2012-11-03) +------------------ + +- Added ability to customize string coercion (e.g. to have None render + as ``''``) (issue #130). +- Added Renderer.render\_name() to render a template by name (issue + #122). +- Added TemplateSpec.template\_path to specify an absolute path to a + template (issue #41). +- Added option of raising errors on missing tags/partials: + ``Renderer(missing_tags='strict')`` (issue #110). +- Added support for finding and loading templates by file name in + addition to by template name (issue #127). [xgecko] +- Added a ``parse()`` function that yields a printable, pre-compiled + parse tree. +- Added support for rendering pre-compiled templates. +- Added Python 3.3 to the list of supported versions. +- Added support for `PyPy `__ (issue #125). +- Added support for `Travis CI `__ (issue #124). + [msabramo] +- Bugfix: ``defaults.DELIMITERS`` can now be changed at runtime (issue + #135). [bennoleslie] +- Bugfix: exceptions raised from a property are no longer swallowed + when getting a key from a context stack (issue #110). +- Bugfix: lambda section values can now return non-ascii, non-unicode + strings (issue #118). +- Bugfix: allow ``test_pystache.py`` and ``tox`` to pass when run from + a downloaded sdist (i.e. without the spec test directory). +- Convert HISTORY and README files from reST to Markdown. +- More robust handling of byte strings in Python 3. +- Added Creative Commons license for David Phillips's logo. + +0.5.2 (2012-05-03) +------------------ + +- Added support for dot notation and version 1.1.2 of the spec (issue + #99). [rbp] +- Missing partials now render as empty string per latest version of + spec (issue #115). +- Bugfix: falsey values now coerced to strings using str(). +- Bugfix: lambda return values for sections no longer pushed onto + context stack (issue #113). +- Bugfix: lists of lambdas for sections were not rendered (issue #114). + +0.5.1 (2012-04-24) +------------------ + +- Added support for Python 3.1 and 3.2. +- Added tox support to test multiple Python versions. +- Added test script entry point: pystache-test. +- Added \_\_version\_\_ package attribute. +- Test harness now supports both YAML and JSON forms of Mustache spec. +- Test harness no longer requires nose. + +0.5.0 (2012-04-03) +------------------ + +This version represents a major rewrite and refactoring of the code base +that also adds features and fixes many bugs. All functionality and +nearly all unit tests have been preserved. However, some backwards +incompatible changes to the API have been made. + +Below is a selection of some of the changes (not exhaustive). + +Highlights: + +- Pystache now passes all tests in version 1.0.3 of the `Mustache + spec `__. [pvande] +- Removed View class: it is no longer necessary to subclass from View + or from any other class to create a view. +- Replaced Template with Renderer class: template rendering behavior + can be modified via the Renderer constructor or by setting attributes + on a Renderer instance. +- Added TemplateSpec class: template rendering can be specified on a + per-view basis by subclassing from TemplateSpec. +- Introduced separation of concerns and removed circular dependencies + (e.g. between Template and View classes, cf. `issue + #13 `__). +- Unicode now used consistently throughout the rendering process. +- Expanded test coverage: nosetests now runs doctests and ~105 test + cases from the Mustache spec (increasing the number of tests from 56 + to ~315). +- Added a rudimentary benchmarking script to gauge performance while + refactoring. +- Extensive documentation added (e.g. docstrings). + +Other changes: + +- Added a command-line interface. [vrde] +- The main rendering class now accepts a custom partial loader (e.g. a + dictionary) and a custom escape function. +- Non-ascii characters in str strings are now supported while + rendering. +- Added string encoding, file encoding, and errors options for decoding + to unicode. +- Removed the output encoding option. +- Removed the use of markupsafe. + +Bug fixes: + +- Context values no longer processed as template strings. + [jakearchibald] +- Whitespace surrounding sections is no longer altered, per the spec. + [heliodor] +- Zeroes now render correctly when using PyPy. [alex] +- Multline comments now permitted. [fczuardi] +- Extensionless template files are now supported. +- Passing ``**kwargs`` to ``Template()`` no longer modifies the + context. +- Passing ``**kwargs`` to ``Template()`` with no context no longer + raises an exception. + +0.4.1 (2012-03-25) +------------------ + +- Added support for Python 2.4. [wangtz, jvantuyl] + +0.4.0 (2011-01-12) +------------------ + +- Add support for nested contexts (within template and view) +- Add support for inverted lists +- Decoupled template loading + +0.3.1 (2010-05-07) +------------------ + +- Fix package + +0.3.0 (2010-05-03) +------------------ + +- View.template\_path can now hold a list of path +- Add {{& blah}} as an alias for {{{ blah }}} +- Higher Order Sections +- Inverted sections + +0.2.0 (2010-02-15) +------------------ + +- Bugfix: Methods returning False or None are not rendered +- Bugfix: Don't render an empty string when a tag's value is 0. + [enaeseth] +- Add support for using non-callables as View attributes. + [joshthecoder] +- Allow using View instances as attributes. [joshthecoder] +- Support for Unicode and non-ASCII-encoded bytestring output. + [enaeseth] +- Template file encoding awareness. [enaeseth] + +0.1.1 (2009-11-13) +------------------ + +- Ensure we're dealing with strings, always +- Tests can be run by executing the test file directly + +0.1.0 (2009-11-12) +------------------ + +- First release + +License +======= + +Copyright (C) 2012 Chris Jerdonek. All rights reserved. + +Copyright (c) 2009 Chris Wanstrath + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +.. |image0| image:: http://i.creativecommons.org/l/by-sa/3.0/88x31.png diff --git a/python/pystache/test_pystache.py b/python/pystache/test_pystache.py new file mode 100644 index 000000000000..9a1a3ca26de8 --- /dev/null +++ b/python/pystache/test_pystache.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# coding: utf-8 + +""" +Runs project tests. + +This script is a substitute for running-- + + python -m pystache.commands.test + +It is useful in Python 2.4 because the -m flag does not accept subpackages +in Python 2.4: + + http://docs.python.org/using/cmdline.html#cmdoption-m + +""" + +import sys + +from pystache.commands import test +from pystache.tests.main import FROM_SOURCE_OPTION + + +def main(sys_argv=sys.argv): + sys.argv.insert(1, FROM_SOURCE_OPTION) + test.main() + + +if __name__=='__main__': + main() diff --git a/python/pystache/tox.ini b/python/pystache/tox.ini new file mode 100644 index 000000000000..d1eaebfbfc96 --- /dev/null +++ b/python/pystache/tox.ini @@ -0,0 +1,36 @@ +# A tox configuration file to test across multiple Python versions. +# +# http://pypi.python.org/pypi/tox +# +[tox] +# Tox 1.4 drops py24 and adds py33. In the current version, we want to +# support 2.4, so we can't simultaneously support 3.3. +envlist = py24,py25,py26,py27,py27-yaml,py27-noargs,py31,py32,pypy + +[testenv] +# Change the working directory so that we don't import the pystache located +# in the original location. +changedir = + {envbindir} +commands = + pystache-test {toxinidir} + +# Check that the spec tests work with PyYAML. +[testenv:py27-yaml] +basepython = + python2.7 +deps = + PyYAML +changedir = + {envbindir} +commands = + pystache-test {toxinidir} + +# Check that pystache-test works from an install with no arguments. +[testenv:py27-noargs] +basepython = + python2.7 +changedir = + {envbindir} +commands = + pystache-test diff --git a/python/pyyaml/CHANGES b/python/pyyaml/CHANGES new file mode 100644 index 000000000000..938dc4690a50 --- /dev/null +++ b/python/pyyaml/CHANGES @@ -0,0 +1,147 @@ + +For a complete Mercurial changelog, see +'https://bitbucket.org/xi/pyyaml/commits'. + +3.11 (2014-03-26) +----------------- + +* Source and binary distributions are rebuilt against the latest + versions of Cython and LibYAML. + +3.10 (2011-05-30) +----------------- + +* Do not try to build LibYAML bindings on platforms other than CPython + (Thank to olt(at)bogosoft(dot)com). +* Clear cyclic references in the parser and the emitter + (Thank to kristjan(at)ccpgames(dot)com). +* Dropped support for Python 2.3 and 2.4. + +3.09 (2009-08-31) +----------------- + +* Fixed an obscure scanner error not reported when there is + no line break at the end of the stream (Thank to Ingy). +* Fixed use of uninitialized memory when emitting anchors with + LibYAML bindings (Thank to cegner(at)yahoo-inc(dot)com). +* Fixed emitting incorrect BOM characters for UTF-16 (Thank to + Valentin Nechayev) +* Fixed the emitter for folded scalars not respecting the preferred + line width (Thank to Ingy). +* Fixed a subtle ordering issue with emitting '%TAG' directives + (Thank to Andrey Somov). +* Fixed performance regression with LibYAML bindings. + + +3.08 (2008-12-31) +----------------- + +* Python 3 support (Thank to Erick Tryzelaar). +* Use Cython instead of Pyrex to build LibYAML bindings. +* Refactored support for unicode and byte input/output streams. + + +3.07 (2008-12-29) +----------------- + +* The emitter learned to use an optional indentation indicator + for block scalar; thus scalars with leading whitespaces + could now be represented in a literal or folded style. +* The test suite is now included in the source distribution. + To run the tests, type 'python setup.py test'. +* Refactored the test suite: dropped unittest in favor of + a custom test appliance. +* Fixed the path resolver in CDumper. +* Forced an explicit document end indicator when there is + a possibility of parsing ambiguity. +* More setup.py improvements: the package should be usable + when any combination of setuptools, Pyrex and LibYAML + is installed. +* Windows binary packages are built against LibYAML-0.1.2. +* Minor typos and corrections (Thank to Ingy dot Net + and Andrey Somov). + + +3.06 (2008-10-03) +----------------- + +* setup.py checks whether LibYAML is installed and if so, builds + and installs LibYAML bindings. To force or disable installation + of LibYAML bindings, use '--with-libyaml' or '--without-libyaml' + respectively. +* The source distribution includes compiled Pyrex sources so + building LibYAML bindings no longer requires Pyrex installed. +* 'yaml.load()' raises an exception if the input stream contains + more than one YAML document. +* Fixed exceptions produced by LibYAML bindings. +* Fixed a dot '.' character being recognized as !!float. +* Fixed Python 2.3 compatibility issue in constructing !!timestamp values. +* Windows binary packages are built against the LibYAML stable branch. +* Added attributes 'yaml.__version__' and 'yaml.__with_libyaml__'. + + +3.05 (2007-05-13) +----------------- + +* Windows binary packages were built with LibYAML trunk. +* Fixed a bug that prevent processing a live stream of YAML documents in + timely manner (Thanks edward(at)sweetbytes(dot)net). +* Fixed a bug when the path in add_path_resolver contains boolean values + (Thanks jstroud(at)mbi(dot)ucla(dot)edu). +* Fixed loss of microsecond precision in timestamps + (Thanks edemaine(at)mit(dot)edu). +* Fixed loading an empty YAML stream. +* Allowed immutable subclasses of YAMLObject. +* Made the encoding of the unicode->str conversion explicit so that + the conversion does not depend on the default Python encoding. +* Forced emitting float values in a YAML compatible form. + + +3.04 (2006-08-20) +----------------- + +* Include experimental LibYAML bindings. +* Fully support recursive structures. +* Sort dictionary keys. Mapping node values are now represented + as lists of pairs instead of dictionaries. No longer check + for duplicate mapping keys as it didn't work correctly anyway. +* Fix invalid output of single-quoted scalars in cases when a single + quote is not escaped when preceeded by whitespaces or line breaks. +* To make porting easier, rewrite Parser not using generators. +* Fix handling of unexpected block mapping values. +* Fix a bug in Representer.represent_object: copy_reg.dispatch_table + was not correctly handled. +* Fix a bug when a block scalar is incorrectly emitted in the simple + key context. +* Hold references to the objects being represented. +* Make Representer not try to guess !!pairs when a list is represented. +* Fix timestamp constructing and representing. +* Fix the 'N' plain scalar being incorrectly recognized as !!bool. + + +3.03 (2006-06-19) +----------------- + +* Fix Python 2.5 compatibility issues. +* Fix numerous bugs in the float handling. +* Fix scanning some ill-formed documents. +* Other minor fixes. + + +3.02 (2006-05-15) +----------------- + +* Fix win32 installer. Apparently bdist_wininst does not work well + under Linux. +* Fix a bug in add_path_resolver. +* Add the yaml-highlight example. Try to run on a color terminal: + `python yaml_hl.py >> yaml.load(stream, Loader=yaml.CLoader) + >>> yaml.dump(data, Dumper=yaml.CDumper) + +PyYAML includes a comprehensive test suite. To run the tests, +type 'python setup.py test'. + +For more information, check the PyYAML homepage: +'http://pyyaml.org/wiki/PyYAML'. + +For PyYAML tutorial and reference, see: +'http://pyyaml.org/wiki/PyYAMLDocumentation'. + +Post your questions and opinions to the YAML-Core mailing list: +'http://lists.sourceforge.net/lists/listinfo/yaml-core'. + +Submit bug reports and feature requests to the PyYAML bug tracker: +'http://pyyaml.org/newticket?component=pyyaml'. + +PyYAML is written by Kirill Simonov . It is released +under the MIT license. See the file LICENSE for more details. + diff --git a/python/pyyaml/examples/pygments-lexer/example.yaml b/python/pyyaml/examples/pygments-lexer/example.yaml new file mode 100644 index 000000000000..9c0ed9d082fb --- /dev/null +++ b/python/pyyaml/examples/pygments-lexer/example.yaml @@ -0,0 +1,302 @@ + +# +# Examples from the Preview section of the YAML specification +# (http://yaml.org/spec/1.2/#Preview) +# + +# Sequence of scalars +--- +- Mark McGwire +- Sammy Sosa +- Ken Griffey + +# Mapping scalars to scalars +--- +hr: 65 # Home runs +avg: 0.278 # Batting average +rbi: 147 # Runs Batted In + +# Mapping scalars to sequences +--- +american: + - Boston Red Sox + - Detroit Tigers + - New York Yankees +national: + - New York Mets + - Chicago Cubs + - Atlanta Braves + +# Sequence of mappings +--- +- + name: Mark McGwire + hr: 65 + avg: 0.278 +- + name: Sammy Sosa + hr: 63 + avg: 0.288 + +# Sequence of sequences +--- +- [name , hr, avg ] +- [Mark McGwire, 65, 0.278] +- [Sammy Sosa , 63, 0.288] + +# Mapping of mappings +--- +Mark McGwire: {hr: 65, avg: 0.278} +Sammy Sosa: { + hr: 63, + avg: 0.288 + } + +# Two documents in a stream +--- # Ranking of 1998 home runs +- Mark McGwire +- Sammy Sosa +- Ken Griffey +--- # Team ranking +- Chicago Cubs +- St Louis Cardinals + +# Documents with the end indicator +--- +time: 20:03:20 +player: Sammy Sosa +action: strike (miss) +... +--- +time: 20:03:47 +player: Sammy Sosa +action: grand slam +... + +# Comments +--- +hr: # 1998 hr ranking + - Mark McGwire + - Sammy Sosa +rbi: + # 1998 rbi ranking + - Sammy Sosa + - Ken Griffey + +# Anchors and aliases +--- +hr: + - Mark McGwire + # Following node labeled SS + - &SS Sammy Sosa +rbi: + - *SS # Subsequent occurrence + - Ken Griffey + +# Mapping between sequences +--- +? - Detroit Tigers + - Chicago cubs +: + - 2001-07-23 +? [ New York Yankees, + Atlanta Braves ] +: [ 2001-07-02, 2001-08-12, + 2001-08-14 ] + +# Inline nested mapping +--- +# products purchased +- item : Super Hoop + quantity: 1 +- item : Basketball + quantity: 4 +- item : Big Shoes + quantity: 1 + +# Literal scalars +--- | # ASCII art + \//||\/|| + // || ||__ + +# Folded scalars +--- > + Mark McGwire's + year was crippled + by a knee injury. + +# Preserved indented block in a folded scalar +--- +> + Sammy Sosa completed another + fine season with great stats. + + 63 Home Runs + 0.288 Batting Average + + What a year! + +# Indentation determines scope +--- +name: Mark McGwire +accomplishment: > + Mark set a major league + home run record in 1998. +stats: | + 65 Home Runs + 0.278 Batting Average + +# Quoted scalars +--- +unicode: "Sosa did fine.\u263A" +control: "\b1998\t1999\t2000\n" +hex esc: "\x0d\x0a is \r\n" +single: '"Howdy!" he cried.' +quoted: ' # not a ''comment''.' +tie-fighter: '|\-*-/|' + +# Multi-line flow scalars +--- +plain: + This unquoted scalar + spans many lines. +quoted: "So does this + quoted scalar.\n" + +# Integers +--- +canonical: 12345 +decimal: +12_345 +sexagesimal: 3:25:45 +octal: 014 +hexadecimal: 0xC + +# Floating point +--- +canonical: 1.23015e+3 +exponential: 12.3015e+02 +sexagesimal: 20:30.15 +fixed: 1_230.15 +negative infinity: -.inf +not a number: .NaN + +# Miscellaneous +--- +null: ~ +true: boolean +false: boolean +string: '12345' + +# Timestamps +--- +canonical: 2001-12-15T02:59:43.1Z +iso8601: 2001-12-14t21:59:43.10-05:00 +spaced: 2001-12-14 21:59:43.10 -5 +date: 2002-12-14 + +# Various explicit tags +--- +not-date: !!str 2002-04-28 +picture: !!binary | + R0lGODlhDAAMAIQAAP//9/X + 17unp5WZmZgAAAOfn515eXv + Pz7Y6OjuDg4J+fn5OTk6enp + 56enmleECcgggoBADs= +application specific tag: !something | + The semantics of the tag + above may be different for + different documents. + +# Global tags +%TAG ! tag:clarkevans.com,2002: +--- !shape + # Use the ! handle for presenting + # tag:clarkevans.com,2002:circle +- !circle + center: &ORIGIN {x: 73, y: 129} + radius: 7 +- !line + start: *ORIGIN + finish: { x: 89, y: 102 } +- !label + start: *ORIGIN + color: 0xFFEEBB + text: Pretty vector drawing. + +# Unordered sets +--- !!set +# sets are represented as a +# mapping where each key is +# associated with the empty string +? Mark McGwire +? Sammy Sosa +? Ken Griff + +# Ordered mappings +--- !!omap +# ordered maps are represented as +# a sequence of mappings, with +# each mapping having one key +- Mark McGwire: 65 +- Sammy Sosa: 63 +- Ken Griffy: 58 + +# Full length example +--- ! +invoice: 34843 +date : 2001-01-23 +bill-to: &id001 + given : Chris + family : Dumars + address: + lines: | + 458 Walkman Dr. + Suite #292 + city : Royal Oak + state : MI + postal : 48046 +ship-to: *id001 +product: + - sku : BL394D + quantity : 4 + description : Basketball + price : 450.00 + - sku : BL4438H + quantity : 1 + description : Super Hoop + price : 2392.00 +tax : 251.42 +total: 4443.52 +comments: + Late afternoon is best. + Backup contact is Nancy + Billsmer @ 338-4338. + +# Another full-length example +--- +Time: 2001-11-23 15:01:42 -5 +User: ed +Warning: + This is an error message + for the log file +--- +Time: 2001-11-23 15:02:31 -5 +User: ed +Warning: + A slightly different error + message. +--- +Date: 2001-11-23 15:03:17 -5 +User: ed +Fatal: + Unknown variable "bar" +Stack: + - file: TopClass.py + line: 23 + code: | + x = MoreObject("345\n") + - file: MoreClass.py + line: 58 + code: |- + foo = bar + diff --git a/python/pyyaml/examples/pygments-lexer/yaml.py b/python/pyyaml/examples/pygments-lexer/yaml.py new file mode 100644 index 000000000000..1ce9dac9e4b3 --- /dev/null +++ b/python/pyyaml/examples/pygments-lexer/yaml.py @@ -0,0 +1,431 @@ + +""" +yaml.py + +Lexer for YAML, a human-friendly data serialization language +(http://yaml.org/). + +Written by Kirill Simonov . + +License: Whatever suitable for inclusion into the Pygments package. +""" + +from pygments.lexer import \ + ExtendedRegexLexer, LexerContext, include, bygroups +from pygments.token import \ + Text, Comment, Punctuation, Name, Literal + +__all__ = ['YAMLLexer'] + + +class YAMLLexerContext(LexerContext): + """Indentation context for the YAML lexer.""" + + def __init__(self, *args, **kwds): + super(YAMLLexerContext, self).__init__(*args, **kwds) + self.indent_stack = [] + self.indent = -1 + self.next_indent = 0 + self.block_scalar_indent = None + + +def something(TokenClass): + """Do not produce empty tokens.""" + def callback(lexer, match, context): + text = match.group() + if not text: + return + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + +def reset_indent(TokenClass): + """Reset the indentation levels.""" + def callback(lexer, match, context): + text = match.group() + context.indent_stack = [] + context.indent = -1 + context.next_indent = 0 + context.block_scalar_indent = None + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + +def save_indent(TokenClass, start=False): + """Save a possible indentation level.""" + def callback(lexer, match, context): + text = match.group() + extra = '' + if start: + context.next_indent = len(text) + if context.next_indent < context.indent: + while context.next_indent < context.indent: + context.indent = context.indent_stack.pop() + if context.next_indent > context.indent: + extra = text[context.indent:] + text = text[:context.indent] + else: + context.next_indent += len(text) + if text: + yield match.start(), TokenClass, text + if extra: + yield match.start()+len(text), TokenClass.Error, extra + context.pos = match.end() + return callback + +def set_indent(TokenClass, implicit=False): + """Set the previously saved indentation level.""" + def callback(lexer, match, context): + text = match.group() + if context.indent < context.next_indent: + context.indent_stack.append(context.indent) + context.indent = context.next_indent + if not implicit: + context.next_indent += len(text) + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + +def set_block_scalar_indent(TokenClass): + """Set an explicit indentation level for a block scalar.""" + def callback(lexer, match, context): + text = match.group() + context.block_scalar_indent = None + if not text: + return + increment = match.group(1) + if increment: + current_indent = max(context.indent, 0) + increment = int(increment) + context.block_scalar_indent = current_indent + increment + if text: + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + +def parse_block_scalar_empty_line(IndentTokenClass, ContentTokenClass): + """Process an empty line in a block scalar.""" + def callback(lexer, match, context): + text = match.group() + if (context.block_scalar_indent is None or + len(text) <= context.block_scalar_indent): + if text: + yield match.start(), IndentTokenClass, text + else: + indentation = text[:context.block_scalar_indent] + content = text[context.block_scalar_indent:] + yield match.start(), IndentTokenClass, indentation + yield (match.start()+context.block_scalar_indent, + ContentTokenClass, content) + context.pos = match.end() + return callback + +def parse_block_scalar_indent(TokenClass): + """Process indentation spaces in a block scalar.""" + def callback(lexer, match, context): + text = match.group() + if context.block_scalar_indent is None: + if len(text) <= max(context.indent, 0): + context.stack.pop() + context.stack.pop() + return + context.block_scalar_indent = len(text) + else: + if len(text) < context.block_scalar_indent: + context.stack.pop() + context.stack.pop() + return + if text: + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + +def parse_plain_scalar_indent(TokenClass): + """Process indentation spaces in a plain scalar.""" + def callback(lexer, match, context): + text = match.group() + if len(text) <= context.indent: + context.stack.pop() + context.stack.pop() + return + if text: + yield match.start(), TokenClass, text + context.pos = match.end() + return callback + + +class YAMLLexer(ExtendedRegexLexer): + """Lexer for the YAML language.""" + + name = 'YAML' + aliases = ['yaml'] + filenames = ['*.yaml', '*.yml'] + mimetypes = ['text/x-yaml'] + + tokens = { + + # the root rules + 'root': [ + # ignored whitespaces + (r'[ ]+(?=#|$)', Text.Blank), + # line breaks + (r'\n+', Text.Break), + # a comment + (r'#[^\n]*', Comment.Single), + # the '%YAML' directive + (r'^%YAML(?=[ ]|$)', reset_indent(Name.Directive), + 'yaml-directive'), + # the %TAG directive + (r'^%TAG(?=[ ]|$)', reset_indent(Name.Directive), + 'tag-directive'), + # document start and document end indicators + (r'^(?:---|\.\.\.)(?=[ ]|$)', + reset_indent(Punctuation.Document), 'block-line'), + # indentation spaces + (r'[ ]*(?![ \t\n\r\f\v]|$)', + save_indent(Text.Indent, start=True), + ('block-line', 'indentation')), + ], + + # trailing whitespaces after directives or a block scalar indicator + 'ignored-line': [ + # ignored whitespaces + (r'[ ]+(?=#|$)', Text.Blank), + # a comment + (r'#[^\n]*', Comment.Single), + # line break + (r'\n', Text.Break, '#pop:2'), + ], + + # the %YAML directive + 'yaml-directive': [ + # the version number + (r'([ ]+)([0-9]+\.[0-9]+)', + bygroups(Text.Blank, Literal.Version), 'ignored-line'), + ], + + # the %YAG directive + 'tag-directive': [ + # a tag handle and the corresponding prefix + (r'([ ]+)(!|![0-9A-Za-z_-]*!)' + r'([ ]+)(!|!?[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)', + bygroups(Text.Blank, Name.Type, Text.Blank, Name.Type), + 'ignored-line'), + ], + + # block scalar indicators and indentation spaces + 'indentation': [ + # trailing whitespaces are ignored + (r'[ ]*$', something(Text.Blank), '#pop:2'), + # whitespaces preceeding block collection indicators + (r'[ ]+(?=[?:-](?:[ ]|$))', save_indent(Text.Indent)), + # block collection indicators + (r'[?:-](?=[ ]|$)', set_indent(Punctuation.Indicator)), + # the beginning a block line + (r'[ ]*', save_indent(Text.Indent), '#pop'), + ], + + # an indented line in the block context + 'block-line': [ + # the line end + (r'[ ]*(?=#|$)', something(Text.Blank), '#pop'), + # whitespaces separating tokens + (r'[ ]+', Text.Blank), + # tags, anchors and aliases, + include('descriptors'), + # block collections and scalars + include('block-nodes'), + # flow collections and quoted scalars + include('flow-nodes'), + # a plain scalar + (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`-]|[?:-][^ \t\n\r\f\v])', + something(Literal.Scalar.Plain), + 'plain-scalar-in-block-context'), + ], + + # tags, anchors, aliases + 'descriptors' : [ + # a full-form tag + (r'!<[0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+>', Name.Type), + # a tag in the form '!', '!suffix' or '!handle!suffix' + (r'!(?:[0-9A-Za-z_-]+)?' + r'(?:![0-9A-Za-z;/?:@&=+$,_.!~*\'()\[\]%-]+)?', Name.Type), + # an anchor + (r'&[0-9A-Za-z_-]+', Name.Anchor), + # an alias + (r'\*[0-9A-Za-z_-]+', Name.Alias), + ], + + # block collections and scalars + 'block-nodes': [ + # implicit key + (r':(?=[ ]|$)', set_indent(Punctuation.Indicator, implicit=True)), + # literal and folded scalars + (r'[|>]', Punctuation.Indicator, + ('block-scalar-content', 'block-scalar-header')), + ], + + # flow collections and quoted scalars + 'flow-nodes': [ + # a flow sequence + (r'\[', Punctuation.Indicator, 'flow-sequence'), + # a flow mapping + (r'\{', Punctuation.Indicator, 'flow-mapping'), + # a single-quoted scalar + (r'\'', Literal.Scalar.Flow.Quote, 'single-quoted-scalar'), + # a double-quoted scalar + (r'\"', Literal.Scalar.Flow.Quote, 'double-quoted-scalar'), + ], + + # the content of a flow collection + 'flow-collection': [ + # whitespaces + (r'[ ]+', Text.Blank), + # line breaks + (r'\n+', Text.Break), + # a comment + (r'#[^\n]*', Comment.Single), + # simple indicators + (r'[?:,]', Punctuation.Indicator), + # tags, anchors and aliases + include('descriptors'), + # nested collections and quoted scalars + include('flow-nodes'), + # a plain scalar + (r'(?=[^ \t\n\r\f\v?:,\[\]{}#&*!|>\'"%@`])', + something(Literal.Scalar.Plain), + 'plain-scalar-in-flow-context'), + ], + + # a flow sequence indicated by '[' and ']' + 'flow-sequence': [ + # include flow collection rules + include('flow-collection'), + # the closing indicator + (r'\]', Punctuation.Indicator, '#pop'), + ], + + # a flow mapping indicated by '{' and '}' + 'flow-mapping': [ + # include flow collection rules + include('flow-collection'), + # the closing indicator + (r'\}', Punctuation.Indicator, '#pop'), + ], + + # block scalar lines + 'block-scalar-content': [ + # line break + (r'\n', Text.Break), + # empty line + (r'^[ ]+$', + parse_block_scalar_empty_line(Text.Indent, + Literal.Scalar.Block)), + # indentation spaces (we may leave the state here) + (r'^[ ]*', parse_block_scalar_indent(Text.Indent)), + # line content + (r'[^\n\r\f\v]+', Literal.Scalar.Block), + ], + + # the content of a literal or folded scalar + 'block-scalar-header': [ + # indentation indicator followed by chomping flag + (r'([1-9])?[+-]?(?=[ ]|$)', + set_block_scalar_indent(Punctuation.Indicator), + 'ignored-line'), + # chomping flag followed by indentation indicator + (r'[+-]?([1-9])?(?=[ ]|$)', + set_block_scalar_indent(Punctuation.Indicator), + 'ignored-line'), + ], + + # ignored and regular whitespaces in quoted scalars + 'quoted-scalar-whitespaces': [ + # leading and trailing whitespaces are ignored + (r'^[ ]+|[ ]+$', Text.Blank), + # line breaks are ignored + (r'\n+', Text.Break), + # other whitespaces are a part of the value + (r'[ ]+', Literal.Scalar.Flow), + ], + + # single-quoted scalars + 'single-quoted-scalar': [ + # include whitespace and line break rules + include('quoted-scalar-whitespaces'), + # escaping of the quote character + (r'\'\'', Literal.Scalar.Flow.Escape), + # regular non-whitespace characters + (r'[^ \t\n\r\f\v\']+', Literal.Scalar.Flow), + # the closing quote + (r'\'', Literal.Scalar.Flow.Quote, '#pop'), + ], + + # double-quoted scalars + 'double-quoted-scalar': [ + # include whitespace and line break rules + include('quoted-scalar-whitespaces'), + # escaping of special characters + (r'\\[0abt\tn\nvfre "\\N_LP]', Literal.Scalar.Flow.Escape), + # escape codes + (r'\\(?:x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})', + Literal.Scalar.Flow.Escape), + # regular non-whitespace characters + (r'[^ \t\n\r\f\v\"\\]+', Literal.Scalar.Flow), + # the closing quote + (r'"', Literal.Scalar.Flow.Quote, '#pop'), + ], + + # the beginning of a new line while scanning a plain scalar + 'plain-scalar-in-block-context-new-line': [ + # empty lines + (r'^[ ]+$', Text.Blank), + # line breaks + (r'\n+', Text.Break), + # document start and document end indicators + (r'^(?=---|\.\.\.)', something(Punctuation.Document), '#pop:3'), + # indentation spaces (we may leave the block line state here) + (r'^[ ]*', parse_plain_scalar_indent(Text.Indent), '#pop'), + ], + + # a plain scalar in the block context + 'plain-scalar-in-block-context': [ + # the scalar ends with the ':' indicator + (r'[ ]*(?=:[ ]|:$)', something(Text.Blank), '#pop'), + # the scalar ends with whitespaces followed by a comment + (r'[ ]+(?=#)', Text.Blank, '#pop'), + # trailing whitespaces are ignored + (r'[ ]+$', Text.Blank), + # line breaks are ignored + (r'\n+', Text.Break, 'plain-scalar-in-block-context-new-line'), + # other whitespaces are a part of the value + (r'[ ]+', Literal.Scalar.Plain), + # regular non-whitespace characters + (r'(?::(?![ \t\n\r\f\v])|[^ \t\n\r\f\v:])+', + Literal.Scalar.Plain), + ], + + # a plain scalar is the flow context + 'plain-scalar-in-flow-context': [ + # the scalar ends with an indicator character + (r'[ ]*(?=[,:?\[\]{}])', something(Text.Blank), '#pop'), + # the scalar ends with a comment + (r'[ ]+(?=#)', Text.Blank, '#pop'), + # leading and trailing whitespaces are ignored + (r'^[ ]+|[ ]+$', Text.Blank), + # line breaks are ignored + (r'\n+', Text.Break), + # other whitespaces are a part of the value + (r'[ ]+', Literal.Scalar.Plain), + # regular non-whitespace characters + (r'[^ \t\n\r\f\v,:?\[\]{}]+', Literal.Scalar.Plain), + ], + + } + + def get_tokens_unprocessed(self, text=None, context=None): + if context is None: + context = YAMLLexerContext(text, 0) + return super(YAMLLexer, self).get_tokens_unprocessed(text, context) + + diff --git a/python/pyyaml/examples/yaml-highlight/yaml_hl.cfg b/python/pyyaml/examples/yaml-highlight/yaml_hl.cfg new file mode 100644 index 000000000000..69bb84776481 --- /dev/null +++ b/python/pyyaml/examples/yaml-highlight/yaml_hl.cfg @@ -0,0 +1,115 @@ +%YAML 1.1 +--- + +ascii: + + header: "\e[0;1;30;40m" + + footer: "\e[0m" + + tokens: + stream-start: + stream-end: + directive: { start: "\e[35m", end: "\e[0;1;30;40m" } + document-start: { start: "\e[35m", end: "\e[0;1;30;40m" } + document-end: { start: "\e[35m", end: "\e[0;1;30;40m" } + block-sequence-start: + block-mapping-start: + block-end: + flow-sequence-start: { start: "\e[33m", end: "\e[0;1;30;40m" } + flow-mapping-start: { start: "\e[33m", end: "\e[0;1;30;40m" } + flow-sequence-end: { start: "\e[33m", end: "\e[0;1;30;40m" } + flow-mapping-end: { start: "\e[33m", end: "\e[0;1;30;40m" } + key: { start: "\e[33m", end: "\e[0;1;30;40m" } + value: { start: "\e[33m", end: "\e[0;1;30;40m" } + block-entry: { start: "\e[33m", end: "\e[0;1;30;40m" } + flow-entry: { start: "\e[33m", end: "\e[0;1;30;40m" } + alias: { start: "\e[32m", end: "\e[0;1;30;40m" } + anchor: { start: "\e[32m", end: "\e[0;1;30;40m" } + tag: { start: "\e[32m", end: "\e[0;1;30;40m" } + scalar: { start: "\e[36m", end: "\e[0;1;30;40m" } + + replaces: + - "\r\n": "\n" + - "\r": "\n" + - "\n": "\n" + - "\x85": "\n" + - "\u2028": "\n" + - "\u2029": "\n" + +html: &html + + tokens: + stream-start: + stream-end: + directive: { start: , end: } + document-start: { start: , end: } + document-end: { start: , end: } + block-sequence-start: + block-mapping-start: + block-end: + flow-sequence-start: { start: , end: } + flow-mapping-start: { start: , end: } + flow-sequence-end: { start: , end: } + flow-mapping-end: { start: , end: } + key: { start: , end: } + value: { start: , end: } + block-entry: { start: , end: } + flow-entry: { start: , end: } + alias: { start: , end: } + anchor: { start: , end: } + tag: { start: , end: } + scalar: { start: , end: } + + events: + stream-start: { start:
 }
+        stream-end:     { end: 
} + document-start: { start: } + document-end: { end: } + sequence-start: { start: } + sequence-end: { end: } + mapping-start: { start: } + mapping-end: { end: } + scalar: { start: , end: } + + replaces: + - "\r\n": "\n" + - "\r": "\n" + - "\n": "\n" + - "\x85": "\n" + - "\u2028": "\n" + - "\u2029": "\n" + - "&": "&" + - "<": "<" + - ">": ">" + +html-page: + + header: | + + + A YAML stream + + + + footer: | + + + + <<: *html + + +# vim: ft=yaml diff --git a/python/pyyaml/examples/yaml-highlight/yaml_hl.py b/python/pyyaml/examples/yaml-highlight/yaml_hl.py new file mode 100755 index 000000000000..d6f7bf4eb299 --- /dev/null +++ b/python/pyyaml/examples/yaml-highlight/yaml_hl.py @@ -0,0 +1,114 @@ +#!/usr/bin/python + +import yaml, codecs, sys, os.path, optparse + +class Style: + + def __init__(self, header=None, footer=None, + tokens=None, events=None, replaces=None): + self.header = header + self.footer = footer + self.replaces = replaces + self.substitutions = {} + for domain, Class in [(tokens, 'Token'), (events, 'Event')]: + if not domain: + continue + for key in domain: + name = ''.join([part.capitalize() for part in key.split('-')]) + cls = getattr(yaml, '%s%s' % (name, Class)) + value = domain[key] + if not value: + continue + start = value.get('start') + end = value.get('end') + if start: + self.substitutions[cls, -1] = start + if end: + self.substitutions[cls, +1] = end + + def __setstate__(self, state): + self.__init__(**state) + +yaml.add_path_resolver(u'tag:yaml.org,2002:python/object:__main__.Style', + [None], dict) +yaml.add_path_resolver(u'tag:yaml.org,2002:pairs', + [None, u'replaces'], list) + +class YAMLHighlight: + + def __init__(self, options): + config = yaml.load(file(options.config, 'rb').read()) + self.style = config[options.style] + if options.input: + self.input = file(options.input, 'rb') + else: + self.input = sys.stdin + if options.output: + self.output = file(options.output, 'wb') + else: + self.output = sys.stdout + + def highlight(self): + input = self.input.read() + if input.startswith(codecs.BOM_UTF16_LE): + input = unicode(input, 'utf-16-le') + elif input.startswith(codecs.BOM_UTF16_BE): + input = unicode(input, 'utf-16-be') + else: + input = unicode(input, 'utf-8') + substitutions = self.style.substitutions + tokens = yaml.scan(input) + events = yaml.parse(input) + markers = [] + number = 0 + for token in tokens: + number += 1 + if token.start_mark.index != token.end_mark.index: + cls = token.__class__ + if (cls, -1) in substitutions: + markers.append([token.start_mark.index, +2, number, substitutions[cls, -1]]) + if (cls, +1) in substitutions: + markers.append([token.end_mark.index, -2, number, substitutions[cls, +1]]) + number = 0 + for event in events: + number += 1 + cls = event.__class__ + if (cls, -1) in substitutions: + markers.append([event.start_mark.index, +1, number, substitutions[cls, -1]]) + if (cls, +1) in substitutions: + markers.append([event.end_mark.index, -1, number, substitutions[cls, +1]]) + markers.sort() + markers.reverse() + chunks = [] + position = len(input) + for index, weight1, weight2, substitution in markers: + if index < position: + chunk = input[index:position] + for substring, replacement in self.style.replaces: + chunk = chunk.replace(substring, replacement) + chunks.append(chunk) + position = index + chunks.append(substitution) + chunks.reverse() + result = u''.join(chunks) + if self.style.header: + self.output.write(self.style.header) + self.output.write(result.encode('utf-8')) + if self.style.footer: + self.output.write(self.style.footer) + +if __name__ == '__main__': + parser = optparse.OptionParser() + parser.add_option('-s', '--style', dest='style', default='ascii', + help="specify the highlighting style", metavar='STYLE') + parser.add_option('-c', '--config', dest='config', + default=os.path.join(os.path.dirname(sys.argv[0]), 'yaml_hl.cfg'), + help="set an alternative configuration file", metavar='CONFIG') + parser.add_option('-i', '--input', dest='input', default=None, + help="set the input file (default: stdin)", metavar='FILE') + parser.add_option('-o', '--output', dest='output', default=None, + help="set the output file (default: stdout)", metavar='FILE') + (options, args) = parser.parse_args() + hl = YAMLHighlight(options) + hl.highlight() + diff --git a/python/pyyaml/ext/_yaml.c b/python/pyyaml/ext/_yaml.c new file mode 100644 index 000000000000..f4a5bc5242ad --- /dev/null +++ b/python/pyyaml/ext/_yaml.c @@ -0,0 +1,22190 @@ +/* Generated by Cython 0.20.1 on Wed Mar 26 13:55:16 2014 */ + +#define PY_SSIZE_T_CLEAN +#ifndef CYTHON_USE_PYLONG_INTERNALS +#ifdef PYLONG_BITS_IN_DIGIT +#define CYTHON_USE_PYLONG_INTERNALS 0 +#else +#include "pyconfig.h" +#ifdef PYLONG_BITS_IN_DIGIT +#define CYTHON_USE_PYLONG_INTERNALS 1 +#else +#define CYTHON_USE_PYLONG_INTERNALS 0 +#endif +#endif +#endif +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02040000 + #error Cython requires Python 2.4+. +#else +#define CYTHON_ABI "0_20_1" +#include /* For offsetof */ +#ifndef offsetof +#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION +#define CYTHON_COMPILING_IN_PYPY 1 +#define CYTHON_COMPILING_IN_CPYTHON 0 +#else +#define CYTHON_COMPILING_IN_PYPY 0 +#define CYTHON_COMPILING_IN_CPYTHON 1 +#endif +#if CYTHON_COMPILING_IN_PYPY +#define Py_OptimizeFlag 0 +#endif +#if PY_VERSION_HEX < 0x02050000 + typedef int Py_ssize_t; + #define PY_SSIZE_T_MAX INT_MAX + #define PY_SSIZE_T_MIN INT_MIN + #define PY_FORMAT_SIZE_T "" + #define CYTHON_FORMAT_SSIZE_T "" + #define PyInt_FromSsize_t(z) PyInt_FromLong(z) + #define PyInt_AsSsize_t(o) __Pyx_PyInt_As_int(o) + #define PyNumber_Index(o) ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \ + (PyErr_Format(PyExc_TypeError, \ + "expected index value, got %.200s", Py_TYPE(o)->tp_name), \ + (PyObject*)0)) + #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \ + !PyComplex_Check(o)) + #define PyIndex_Check __Pyx_PyIndex_Check + #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) + #define __PYX_BUILD_PY_SSIZE_T "i" +#else + #define __PYX_BUILD_PY_SSIZE_T "n" + #define CYTHON_FORMAT_SSIZE_T "z" + #define __Pyx_PyIndex_Check PyIndex_Check +#endif +#if PY_VERSION_HEX < 0x02060000 + #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) + #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) + #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) + #define PyVarObject_HEAD_INIT(type, size) \ + PyObject_HEAD_INIT(type) size, + #define PyType_Modified(t) + typedef struct { + void *buf; + PyObject *obj; + Py_ssize_t len; + Py_ssize_t itemsize; + int readonly; + int ndim; + char *format; + Py_ssize_t *shape; + Py_ssize_t *strides; + Py_ssize_t *suboffsets; + void *internal; + } Py_buffer; + #define PyBUF_SIMPLE 0 + #define PyBUF_WRITABLE 0x0001 + #define PyBUF_FORMAT 0x0004 + #define PyBUF_ND 0x0008 + #define PyBUF_STRIDES (0x0010 | PyBUF_ND) + #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) + #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) + #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) + #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) + #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE) + #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE) + typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); + typedef void (*releasebufferproc)(PyObject *, Py_buffer *); +#endif +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#if PY_VERSION_HEX < 0x02060000 + #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") +#endif +#if PY_MAJOR_VERSION >= 3 + #define Py_TPFLAGS_CHECKTYPES 0 + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#if PY_VERSION_HEX < 0x02060000 + #define Py_TPFLAGS_HAVE_VERSION_TAG 0 +#endif +#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TPFLAGS_IS_ABSTRACT) + #define Py_TPFLAGS_IS_ABSTRACT 0 +#endif +#if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE) + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) +#else + #define CYTHON_PEP393_ENABLED 0 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_VERSION_HEX < 0x02060000 + #define PyBytesObject PyStringObject + #define PyBytes_Type PyString_Type + #define PyBytes_Check PyString_Check + #define PyBytes_CheckExact PyString_CheckExact + #define PyBytes_FromString PyString_FromString + #define PyBytes_FromStringAndSize PyString_FromStringAndSize + #define PyBytes_FromFormat PyString_FromFormat + #define PyBytes_DecodeEscape PyString_DecodeEscape + #define PyBytes_AsString PyString_AsString + #define PyBytes_AsStringAndSize PyString_AsStringAndSize + #define PyBytes_Size PyString_Size + #define PyBytes_AS_STRING PyString_AS_STRING + #define PyBytes_GET_SIZE PyString_GET_SIZE + #define PyBytes_Repr PyString_Repr + #define PyBytes_Concat PyString_Concat + #define PyBytes_ConcatAndDel PyString_ConcatAndDel +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj) || \ + PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#if PY_VERSION_HEX < 0x02060000 + #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) + #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) + #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) + #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) + #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) +#else + #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ + (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ + (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ + (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) + #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ + (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ + (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ + (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) + #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ + (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ + (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ + (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#endif +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) +#else + #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) + #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) + #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) +#endif +#if PY_VERSION_HEX < 0x02050000 + #define __Pyx_NAMESTR(n) ((char *)(n)) + #define __Pyx_DOCSTR(n) ((char *)(n)) +#else + #define __Pyx_NAMESTR(n) (n) + #define __Pyx_DOCSTR(n) (n) +#endif +#ifndef CYTHON_INLINE + #if defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and + a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is + a quiet NaN. */ + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif + + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) +#define _USE_MATH_DEFINES +#endif +#include +#define __PYX_HAVE___yaml +#define __PYX_HAVE_API___yaml +#include "_yaml.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) ( \ + (sizeof(type) < sizeof(Py_ssize_t)) || \ + (sizeof(type) > sizeof(Py_ssize_t) && \ + likely(v < (type)PY_SSIZE_T_MAX || \ + v == (type)PY_SSIZE_T_MAX) && \ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN || \ + v == (type)PY_SSIZE_T_MIN))) || \ + (sizeof(type) == sizeof(Py_ssize_t) && \ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX || \ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromUString(s) __Pyx_PyObject_FromString((char*)s) +#define __Pyx_PyBytes_FromUString(s) __Pyx_PyBytes_FromString((char*)s) +#define __Pyx_PyByteArray_FromUString(s) __Pyx_PyByteArray_FromString((char*)s) +#define __Pyx_PyStr_FromUString(s) __Pyx_PyStr_FromString((char*)s) +#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return u_end - u - 1; +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_COMPILING_IN_CPYTHON +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys = NULL; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + sys = PyImport_ImportModule("sys"); + if (sys == NULL) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + if (default_encoding == NULL) goto bad; + if (strcmp(PyBytes_AsString(default_encoding), "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + const char* default_encoding_c = PyBytes_AS_STRING(default_encoding); + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (ascii_chars_u == NULL) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (ascii_chars_b == NULL || strncmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + } + Py_XDECREF(sys); + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return 0; +bad: + Py_XDECREF(sys); + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys = NULL; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (sys == NULL) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + if (default_encoding == NULL) goto bad; + default_encoding_c = PyBytes_AS_STRING(default_encoding); + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(sys); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(sys); + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +#ifdef __GNUC__ + /* Test for GCC > 2.95 */ + #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) + #else /* __GNUC__ > 2 ... */ + #define likely(x) (x) + #define unlikely(x) (x) + #endif /* __GNUC__ > 2 ... */ +#else /* __GNUC__ */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "_yaml.pyx", +}; + +/*--- Type declarations ---*/ +struct __pyx_obj_5_yaml_Mark; +struct __pyx_obj_5_yaml_CParser; +struct __pyx_obj_5_yaml_CEmitter; + +/* "_yaml.pyx":64 + * MappingNode = yaml.nodes.MappingNode + * + * cdef class Mark: # <<<<<<<<<<<<<< + * cdef readonly object name + * cdef readonly int index + */ +struct __pyx_obj_5_yaml_Mark { + PyObject_HEAD + PyObject *name; + int index; + int line; + int column; + PyObject *buffer; + PyObject *pointer; +}; + + +/* "_yaml.pyx":247 + * # self.style = style + * + * cdef class CParser: # <<<<<<<<<<<<<< + * + * cdef yaml_parser_t parser + */ +struct __pyx_obj_5_yaml_CParser { + PyObject_HEAD + struct __pyx_vtabstruct_5_yaml_CParser *__pyx_vtab; + yaml_parser_t parser; + yaml_event_t parsed_event; + PyObject *stream; + PyObject *stream_name; + PyObject *current_token; + PyObject *current_event; + PyObject *anchors; + PyObject *stream_cache; + int stream_cache_len; + int stream_cache_pos; + int unicode_source; +}; + + +/* "_yaml.pyx":935 + * return 1 + * + * cdef class CEmitter: # <<<<<<<<<<<<<< + * + * cdef yaml_emitter_t emitter + */ +struct __pyx_obj_5_yaml_CEmitter { + PyObject_HEAD + struct __pyx_vtabstruct_5_yaml_CEmitter *__pyx_vtab; + yaml_emitter_t emitter; + PyObject *stream; + int document_start_implicit; + int document_end_implicit; + PyObject *use_version; + PyObject *use_tags; + PyObject *serialized_nodes; + PyObject *anchors; + int last_alias_id; + int closed; + int dump_unicode; + PyObject *use_encoding; +}; + + + +/* "_yaml.pyx":247 + * # self.style = style + * + * cdef class CParser: # <<<<<<<<<<<<<< + * + * cdef yaml_parser_t parser + */ + +struct __pyx_vtabstruct_5_yaml_CParser { + PyObject *(*_parser_error)(struct __pyx_obj_5_yaml_CParser *); + PyObject *(*_scan)(struct __pyx_obj_5_yaml_CParser *); + PyObject *(*_token_to_object)(struct __pyx_obj_5_yaml_CParser *, yaml_token_t *); + PyObject *(*_parse)(struct __pyx_obj_5_yaml_CParser *); + PyObject *(*_event_to_object)(struct __pyx_obj_5_yaml_CParser *, yaml_event_t *); + PyObject *(*_compose_document)(struct __pyx_obj_5_yaml_CParser *); + PyObject *(*_compose_node)(struct __pyx_obj_5_yaml_CParser *, PyObject *, PyObject *); + PyObject *(*_compose_scalar_node)(struct __pyx_obj_5_yaml_CParser *, PyObject *); + PyObject *(*_compose_sequence_node)(struct __pyx_obj_5_yaml_CParser *, PyObject *); + PyObject *(*_compose_mapping_node)(struct __pyx_obj_5_yaml_CParser *, PyObject *); + int (*_parse_next_event)(struct __pyx_obj_5_yaml_CParser *); +}; +static struct __pyx_vtabstruct_5_yaml_CParser *__pyx_vtabptr_5_yaml_CParser; + + +/* "_yaml.pyx":935 + * return 1 + * + * cdef class CEmitter: # <<<<<<<<<<<<<< + * + * cdef yaml_emitter_t emitter + */ + +struct __pyx_vtabstruct_5_yaml_CEmitter { + PyObject *(*_emitter_error)(struct __pyx_obj_5_yaml_CEmitter *); + int (*_object_to_event)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *, yaml_event_t *); + int (*_anchor_node)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *); + int (*_serialize_node)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *, PyObject *, PyObject *); +}; +static struct __pyx_vtabstruct_5_yaml_CEmitter *__pyx_vtabptr_5_yaml_CEmitter; +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil) \ + if (acquire_gil) { \ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ + PyGILState_Release(__pyx_gilstate_save); \ + } else { \ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil) \ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext() \ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif /* CYTHON_REFNANNY */ +#define __Pyx_XDECREF_SET(r, v) do { \ + PyObject *tmp = (PyObject *) r; \ + r = v; __Pyx_XDECREF(tmp); \ + } while (0) +#define __Pyx_DECREF_SET(r, v) do { \ + PyObject *tmp = (PyObject *) r; \ + r = v; __Pyx_DECREF(tmp); \ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +static PyObject *__Pyx_GetBuiltinName(PyObject *name); /*proto*/ + +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ + +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ + const char* function_name); /*proto*/ + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); /*proto*/ +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); /*proto*/ + +static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); /*proto*/ + +static CYTHON_INLINE int __Pyx_PySequence_Contains(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname); + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + Py_SIZE(list) = len+1; + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL) +static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_setattro)) + return tp->tp_setattro(obj, attr_name, value); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_setattr)) + return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value); +#endif + return PyObject_SetAttr(obj, attr_name, value); +} +#else +#define __Pyx_PyObject_DelAttrStr(o,n) PyObject_DelAttr(o,n) +#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v) +#endif + +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); /*proto*/ + +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /*proto*/ + +#include + +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/ + +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/ + +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals +#else +#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals +#endif + +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/ + +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ + +static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /*proto*/ + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +static int __Pyx_check_binary_version(void); + +typedef struct { + int code_line; + PyCodeObject* code_object; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); /*proto*/ + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ + + +/* Module declarations from '_yaml' */ +static PyTypeObject *__pyx_ptype_5_yaml_Mark = 0; +static PyTypeObject *__pyx_ptype_5_yaml_CParser = 0; +static PyTypeObject *__pyx_ptype_5_yaml_CEmitter = 0; +static int __pyx_f_5_yaml_input_handler(void *, char *, int, int *); /*proto*/ +static int __pyx_f_5_yaml_output_handler(void *, char *, int); /*proto*/ +#define __Pyx_MODULE_NAME "_yaml" +int __pyx_module_is_main__yaml = 0; + +/* Implementation of '_yaml' */ +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_AttributeError; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_pf_5_yaml_get_version_string(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_2get_version(CYTHON_UNUSED PyObject *__pyx_self); /* proto */ +static int __pyx_pf_5_yaml_4Mark___init__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self, PyObject *__pyx_v_name, int __pyx_v_index, int __pyx_v_line, int __pyx_v_column, PyObject *__pyx_v_buffer, PyObject *__pyx_v_pointer); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_2get_snippet(CYTHON_UNUSED struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_4__str__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_4name___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_5index___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_4line___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_6column___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_6buffer___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_4Mark_7pointer___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self); /* proto */ +static int __pyx_pf_5_yaml_7CParser___init__(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_stream); /* proto */ +static void __pyx_pf_5_yaml_7CParser_2__dealloc__(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_4dispose(CYTHON_UNUSED struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_6raw_scan(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_8get_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_10peek_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_12check_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_choices); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_14raw_parse(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_16get_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_18peek_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_20check_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_choices); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_22check_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_24get_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_7CParser_26get_single_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self); /* proto */ +static int __pyx_pf_5_yaml_8CEmitter___init__(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_stream, PyObject *__pyx_v_canonical, PyObject *__pyx_v_indent, PyObject *__pyx_v_width, PyObject *__pyx_v_allow_unicode, PyObject *__pyx_v_line_break, PyObject *__pyx_v_encoding, PyObject *__pyx_v_explicit_start, PyObject *__pyx_v_explicit_end, PyObject *__pyx_v_version, PyObject *__pyx_v_tags); /* proto */ +static void __pyx_pf_5_yaml_8CEmitter_2__dealloc__(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_8CEmitter_4dispose(CYTHON_UNUSED struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_8CEmitter_6emit(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_event_object); /* proto */ +static PyObject *__pyx_pf_5_yaml_8CEmitter_8open(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_8CEmitter_10close(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_5_yaml_8CEmitter_12serialize(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_node); /* proto */ +static PyObject *__pyx_tp_new_5_yaml_Mark(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_5_yaml_CParser(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_tp_new_5_yaml_CEmitter(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static char __pyx_k__3[] = "?"; +static char __pyx_k__6[] = ""; +static char __pyx_k__7[] = "'"; +static char __pyx_k__8[] = "\""; +static char __pyx_k__9[] = "|"; +static char __pyx_k_TAG[] = "TAG"; +static char __pyx_k__10[] = ">"; +static char __pyx_k__17[] = "\r"; +static char __pyx_k__18[] = "\n"; +static char __pyx_k__19[] = "\r\n"; +static char __pyx_k_tag[] = "tag"; +static char __pyx_k_YAML[] = "YAML"; +static char __pyx_k_file[] = ""; +static char __pyx_k_line[] = "line"; +static char __pyx_k_main[] = "__main__"; +static char __pyx_k_name[] = "name"; +static char __pyx_k_read[] = "read"; +static char __pyx_k_tags[] = "tags"; +static char __pyx_k_test[] = "__test__"; +static char __pyx_k_yaml[] = "yaml"; +static char __pyx_k_class[] = "__class__"; +static char __pyx_k_error[] = "error"; +static char __pyx_k_index[] = "index"; +static char __pyx_k_major[] = "major"; +static char __pyx_k_minor[] = "minor"; +static char __pyx_k_nodes[] = "nodes"; +static char __pyx_k_patch[] = "patch"; +static char __pyx_k_style[] = "style"; +static char __pyx_k_utf_8[] = "utf-8"; +static char __pyx_k_value[] = "value"; +static char __pyx_k_width[] = "width"; +static char __pyx_k_write[] = "write"; +static char __pyx_k_anchor[] = "anchor"; +static char __pyx_k_buffer[] = "buffer"; +static char __pyx_k_column[] = "column"; +static char __pyx_k_events[] = "events"; +static char __pyx_k_id_03d[] = "id%03d"; +static char __pyx_k_import[] = "__import__"; +static char __pyx_k_indent[] = "indent"; +static char __pyx_k_parser[] = "parser"; +static char __pyx_k_reader[] = "reader"; +static char __pyx_k_stream[] = "stream"; +static char __pyx_k_strict[] = "strict"; +static char __pyx_k_tokens[] = "tokens"; +static char __pyx_k_yaml_2[] = "_yaml"; +static char __pyx_k_emitter[] = "emitter"; +static char __pyx_k_pointer[] = "pointer"; +static char __pyx_k_resolve[] = "resolve"; +static char __pyx_k_scanner[] = "scanner"; +static char __pyx_k_version[] = "version"; +static char __pyx_k_KeyToken[] = "KeyToken"; +static char __pyx_k_TagToken[] = "TagToken"; +static char __pyx_k_composer[] = "composer"; +static char __pyx_k_encoding[] = "encoding"; +static char __pyx_k_end_mark[] = "end_mark"; +static char __pyx_k_explicit[] = "explicit"; +static char __pyx_k_implicit[] = "implicit"; +static char __pyx_k_TypeError[] = "TypeError"; +static char __pyx_k_YAMLError[] = "YAMLError"; +static char __pyx_k_canonical[] = "canonical"; +static char __pyx_k_utf_16_be[] = "utf-16-be"; +static char __pyx_k_utf_16_le[] = "utf-16-le"; +static char __pyx_k_AliasEvent[] = "AliasEvent"; +static char __pyx_k_AliasToken[] = "AliasToken"; +static char __pyx_k_ScalarNode[] = "ScalarNode"; +static char __pyx_k_ValueError[] = "ValueError"; +static char __pyx_k_ValueToken[] = "ValueToken"; +static char __pyx_k_flow_style[] = "flow_style"; +static char __pyx_k_line_break[] = "line_break"; +static char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static char __pyx_k_serializer[] = "serializer"; +static char __pyx_k_start_mark[] = "start_mark"; +static char __pyx_k_AnchorToken[] = "AnchorToken"; +static char __pyx_k_MappingNode[] = "MappingNode"; +static char __pyx_k_MemoryError[] = "MemoryError"; +static char __pyx_k_ParserError[] = "ParserError"; +static char __pyx_k_ReaderError[] = "ReaderError"; +static char __pyx_k_ScalarEvent[] = "ScalarEvent"; +static char __pyx_k_ScalarToken[] = "ScalarToken"; +static char __pyx_k_byte_string[] = ""; +static char __pyx_k_constructor[] = "constructor"; +static char __pyx_k_get_version[] = "get_version"; +static char __pyx_k_representer[] = "representer"; +static char __pyx_k_EmitterError[] = "EmitterError"; +static char __pyx_k_ScannerError[] = "ScannerError"; +static char __pyx_k_SequenceNode[] = "SequenceNode"; +static char __pyx_k_explicit_end[] = "explicit_end"; +static char __pyx_k_BlockEndToken[] = "BlockEndToken"; +static char __pyx_k_ComposerError[] = "ComposerError"; +static char __pyx_k_allow_unicode[] = "allow_unicode"; +static char __pyx_k_too_many_tags[] = "too many tags"; +static char __pyx_k_AttributeError[] = "AttributeError"; +static char __pyx_k_DirectiveToken[] = "DirectiveToken"; +static char __pyx_k_FlowEntryToken[] = "FlowEntryToken"; +static char __pyx_k_StreamEndEvent[] = "StreamEndEvent"; +static char __pyx_k_StreamEndToken[] = "StreamEndToken"; +static char __pyx_k_explicit_start[] = "explicit_start"; +static char __pyx_k_unicode_string[] = ""; +static char __pyx_k_BlockEntryToken[] = "BlockEntryToken"; +static char __pyx_k_MappingEndEvent[] = "MappingEndEvent"; +static char __pyx_k_SerializerError[] = "SerializerError"; +static char __pyx_k_ascend_resolver[] = "ascend_resolver"; +static char __pyx_k_invalid_event_s[] = "invalid event %s"; +static char __pyx_k_no_parser_error[] = "no parser error"; +static char __pyx_k_ConstructorError[] = "ConstructorError"; +static char __pyx_k_DocumentEndEvent[] = "DocumentEndEvent"; +static char __pyx_k_DocumentEndToken[] = "DocumentEndToken"; +static char __pyx_k_RepresenterError[] = "RepresenterError"; +static char __pyx_k_SequenceEndEvent[] = "SequenceEndEvent"; +static char __pyx_k_StreamStartEvent[] = "StreamStartEvent"; +static char __pyx_k_StreamStartToken[] = "StreamStartToken"; +static char __pyx_k_descend_resolver[] = "descend_resolver"; +static char __pyx_k_no_emitter_error[] = "no emitter error"; +static char __pyx_k_second_occurence[] = "second occurence"; +static char __pyx_k_MappingStartEvent[] = "MappingStartEvent"; +static char __pyx_k_DocumentStartEvent[] = "DocumentStartEvent"; +static char __pyx_k_DocumentStartToken[] = "DocumentStartToken"; +static char __pyx_k_SequenceStartEvent[] = "SequenceStartEvent"; +static char __pyx_k_get_version_string[] = "get_version_string"; +static char __pyx_k_unknown_event_type[] = "unknown event type"; +static char __pyx_k_unknown_token_type[] = "unknown token type"; +static char __pyx_k_FlowMappingEndToken[] = "FlowMappingEndToken"; +static char __pyx_k_FlowSequenceEndToken[] = "FlowSequenceEndToken"; +static char __pyx_k_in_s_line_d_column_d[] = " in \"%s\", line %d, column %d"; +static char __pyx_k_serializer_is_closed[] = "serializer is closed"; +static char __pyx_k_tag_must_be_a_string[] = "tag must be a string"; +static char __pyx_k_FlowMappingStartToken[] = "FlowMappingStartToken"; +static char __pyx_k_found_undefined_alias[] = "found undefined alias"; +static char __pyx_k_BlockMappingStartToken[] = "BlockMappingStartToken"; +static char __pyx_k_FlowSequenceStartToken[] = "FlowSequenceStartToken"; +static char __pyx_k_value_must_be_a_string[] = "value must be a string"; +static char __pyx_k_BlockSequenceStartToken[] = "BlockSequenceStartToken"; +static char __pyx_k_anchor_must_be_a_string[] = "anchor must be a string"; +static char __pyx_k_serializer_is_not_opened[] = "serializer is not opened"; +static char __pyx_k_a_string_value_is_expected[] = "a string value is expected"; +static char __pyx_k_but_found_another_document[] = "but found another document"; +static char __pyx_k_tag_handle_must_be_a_string[] = "tag handle must be a string"; +static char __pyx_k_tag_prefix_must_be_a_string[] = "tag prefix must be a string"; +static char __pyx_k_serializer_is_already_opened[] = "serializer is already opened"; +static char __pyx_k_root_src_pyyaml_ext__yaml_pyx[] = "/root/src/pyyaml/ext/_yaml.pyx"; +static char __pyx_k_a_string_or_stream_input_is_requ[] = "a string or stream input is required"; +static char __pyx_k_expected_a_single_document_in_th[] = "expected a single document in the stream"; +static char __pyx_k_found_duplicate_anchor_first_occ[] = "found duplicate anchor; first occurence"; +static PyObject *__pyx_n_s_AliasEvent; +static PyObject *__pyx_n_s_AliasToken; +static PyObject *__pyx_n_s_AnchorToken; +static PyObject *__pyx_n_s_AttributeError; +static PyObject *__pyx_n_s_BlockEndToken; +static PyObject *__pyx_n_s_BlockEntryToken; +static PyObject *__pyx_n_s_BlockMappingStartToken; +static PyObject *__pyx_n_s_BlockSequenceStartToken; +static PyObject *__pyx_n_s_ComposerError; +static PyObject *__pyx_n_s_ConstructorError; +static PyObject *__pyx_n_s_DirectiveToken; +static PyObject *__pyx_n_s_DocumentEndEvent; +static PyObject *__pyx_n_s_DocumentEndToken; +static PyObject *__pyx_n_s_DocumentStartEvent; +static PyObject *__pyx_n_s_DocumentStartToken; +static PyObject *__pyx_n_s_EmitterError; +static PyObject *__pyx_n_s_FlowEntryToken; +static PyObject *__pyx_n_s_FlowMappingEndToken; +static PyObject *__pyx_n_s_FlowMappingStartToken; +static PyObject *__pyx_n_s_FlowSequenceEndToken; +static PyObject *__pyx_n_s_FlowSequenceStartToken; +static PyObject *__pyx_n_s_KeyToken; +static PyObject *__pyx_n_s_MappingEndEvent; +static PyObject *__pyx_n_s_MappingNode; +static PyObject *__pyx_n_s_MappingStartEvent; +static PyObject *__pyx_n_s_MemoryError; +static PyObject *__pyx_n_s_ParserError; +static PyObject *__pyx_n_s_ReaderError; +static PyObject *__pyx_n_s_RepresenterError; +static PyObject *__pyx_n_s_ScalarEvent; +static PyObject *__pyx_n_s_ScalarNode; +static PyObject *__pyx_n_s_ScalarToken; +static PyObject *__pyx_n_s_ScannerError; +static PyObject *__pyx_n_s_SequenceEndEvent; +static PyObject *__pyx_n_s_SequenceNode; +static PyObject *__pyx_n_s_SequenceStartEvent; +static PyObject *__pyx_n_s_SerializerError; +static PyObject *__pyx_n_s_StreamEndEvent; +static PyObject *__pyx_n_s_StreamEndToken; +static PyObject *__pyx_n_s_StreamStartEvent; +static PyObject *__pyx_n_s_StreamStartToken; +static PyObject *__pyx_n_u_TAG; +static PyObject *__pyx_n_s_TagToken; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_ValueToken; +static PyObject *__pyx_n_u_YAML; +static PyObject *__pyx_n_s_YAMLError; +static PyObject *__pyx_kp_s__10; +static PyObject *__pyx_kp_u__10; +static PyObject *__pyx_kp_s__17; +static PyObject *__pyx_kp_s__18; +static PyObject *__pyx_kp_s__19; +static PyObject *__pyx_kp_s__3; +static PyObject *__pyx_kp_u__3; +static PyObject *__pyx_kp_u__6; +static PyObject *__pyx_kp_s__7; +static PyObject *__pyx_kp_u__7; +static PyObject *__pyx_kp_s__8; +static PyObject *__pyx_kp_u__8; +static PyObject *__pyx_kp_s__9; +static PyObject *__pyx_kp_u__9; +static PyObject *__pyx_kp_s_a_string_or_stream_input_is_requ; +static PyObject *__pyx_kp_u_a_string_or_stream_input_is_requ; +static PyObject *__pyx_kp_s_a_string_value_is_expected; +static PyObject *__pyx_kp_u_a_string_value_is_expected; +static PyObject *__pyx_n_s_allow_unicode; +static PyObject *__pyx_n_s_anchor; +static PyObject *__pyx_kp_s_anchor_must_be_a_string; +static PyObject *__pyx_kp_u_anchor_must_be_a_string; +static PyObject *__pyx_n_s_ascend_resolver; +static PyObject *__pyx_n_s_buffer; +static PyObject *__pyx_kp_s_but_found_another_document; +static PyObject *__pyx_kp_u_but_found_another_document; +static PyObject *__pyx_kp_s_byte_string; +static PyObject *__pyx_kp_u_byte_string; +static PyObject *__pyx_n_s_canonical; +static PyObject *__pyx_n_s_class; +static PyObject *__pyx_n_s_column; +static PyObject *__pyx_n_s_composer; +static PyObject *__pyx_n_s_constructor; +static PyObject *__pyx_n_s_descend_resolver; +static PyObject *__pyx_n_s_emitter; +static PyObject *__pyx_n_s_encoding; +static PyObject *__pyx_n_u_encoding; +static PyObject *__pyx_n_s_end_mark; +static PyObject *__pyx_n_s_error; +static PyObject *__pyx_n_s_events; +static PyObject *__pyx_kp_s_expected_a_single_document_in_th; +static PyObject *__pyx_kp_u_expected_a_single_document_in_th; +static PyObject *__pyx_n_s_explicit; +static PyObject *__pyx_n_s_explicit_end; +static PyObject *__pyx_n_s_explicit_start; +static PyObject *__pyx_kp_s_file; +static PyObject *__pyx_kp_u_file; +static PyObject *__pyx_n_s_flow_style; +static PyObject *__pyx_kp_s_found_duplicate_anchor_first_occ; +static PyObject *__pyx_kp_u_found_duplicate_anchor_first_occ; +static PyObject *__pyx_kp_s_found_undefined_alias; +static PyObject *__pyx_kp_u_found_undefined_alias; +static PyObject *__pyx_n_s_get_version; +static PyObject *__pyx_n_s_get_version_string; +static PyObject *__pyx_kp_u_id_03d; +static PyObject *__pyx_n_s_implicit; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_kp_s_in_s_line_d_column_d; +static PyObject *__pyx_n_s_indent; +static PyObject *__pyx_n_s_index; +static PyObject *__pyx_kp_s_invalid_event_s; +static PyObject *__pyx_kp_u_invalid_event_s; +static PyObject *__pyx_n_s_line; +static PyObject *__pyx_n_s_line_break; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_major; +static PyObject *__pyx_n_s_minor; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_kp_s_no_emitter_error; +static PyObject *__pyx_kp_u_no_emitter_error; +static PyObject *__pyx_kp_s_no_parser_error; +static PyObject *__pyx_kp_u_no_parser_error; +static PyObject *__pyx_n_s_nodes; +static PyObject *__pyx_n_s_parser; +static PyObject *__pyx_n_s_patch; +static PyObject *__pyx_n_s_pointer; +static PyObject *__pyx_n_s_pyx_vtable; +static PyObject *__pyx_n_s_read; +static PyObject *__pyx_n_s_reader; +static PyObject *__pyx_n_s_representer; +static PyObject *__pyx_n_s_resolve; +static PyObject *__pyx_kp_s_root_src_pyyaml_ext__yaml_pyx; +static PyObject *__pyx_n_s_scanner; +static PyObject *__pyx_kp_s_second_occurence; +static PyObject *__pyx_kp_u_second_occurence; +static PyObject *__pyx_n_s_serializer; +static PyObject *__pyx_kp_s_serializer_is_already_opened; +static PyObject *__pyx_kp_u_serializer_is_already_opened; +static PyObject *__pyx_kp_s_serializer_is_closed; +static PyObject *__pyx_kp_u_serializer_is_closed; +static PyObject *__pyx_kp_s_serializer_is_not_opened; +static PyObject *__pyx_kp_u_serializer_is_not_opened; +static PyObject *__pyx_n_s_start_mark; +static PyObject *__pyx_n_s_stream; +static PyObject *__pyx_n_s_style; +static PyObject *__pyx_n_s_tag; +static PyObject *__pyx_kp_s_tag_handle_must_be_a_string; +static PyObject *__pyx_kp_u_tag_handle_must_be_a_string; +static PyObject *__pyx_kp_s_tag_must_be_a_string; +static PyObject *__pyx_kp_u_tag_must_be_a_string; +static PyObject *__pyx_kp_s_tag_prefix_must_be_a_string; +static PyObject *__pyx_kp_u_tag_prefix_must_be_a_string; +static PyObject *__pyx_n_s_tags; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_tokens; +static PyObject *__pyx_kp_s_too_many_tags; +static PyObject *__pyx_kp_u_too_many_tags; +static PyObject *__pyx_kp_s_unicode_string; +static PyObject *__pyx_kp_u_unicode_string; +static PyObject *__pyx_kp_s_unknown_event_type; +static PyObject *__pyx_kp_u_unknown_event_type; +static PyObject *__pyx_kp_s_unknown_token_type; +static PyObject *__pyx_kp_u_unknown_token_type; +static PyObject *__pyx_kp_s_utf_16_be; +static PyObject *__pyx_kp_u_utf_16_be; +static PyObject *__pyx_kp_s_utf_16_le; +static PyObject *__pyx_kp_u_utf_16_le; +static PyObject *__pyx_kp_u_utf_8; +static PyObject *__pyx_n_s_value; +static PyObject *__pyx_kp_s_value_must_be_a_string; +static PyObject *__pyx_kp_u_value_must_be_a_string; +static PyObject *__pyx_n_s_version; +static PyObject *__pyx_n_s_width; +static PyObject *__pyx_n_s_write; +static PyObject *__pyx_n_s_yaml; +static PyObject *__pyx_n_s_yaml_2; +static PyObject *__pyx_int_0; +static PyObject *__pyx_int_1; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_tuple__12; +static PyObject *__pyx_tuple__13; +static PyObject *__pyx_tuple__14; +static PyObject *__pyx_tuple__15; +static PyObject *__pyx_tuple__16; +static PyObject *__pyx_tuple__20; +static PyObject *__pyx_tuple__21; +static PyObject *__pyx_tuple__22; +static PyObject *__pyx_tuple__23; +static PyObject *__pyx_tuple__24; +static PyObject *__pyx_tuple__25; +static PyObject *__pyx_tuple__26; +static PyObject *__pyx_tuple__27; +static PyObject *__pyx_tuple__28; +static PyObject *__pyx_tuple__29; +static PyObject *__pyx_tuple__30; +static PyObject *__pyx_tuple__31; +static PyObject *__pyx_tuple__32; +static PyObject *__pyx_tuple__33; +static PyObject *__pyx_tuple__34; +static PyObject *__pyx_tuple__35; +static PyObject *__pyx_tuple__36; +static PyObject *__pyx_tuple__37; +static PyObject *__pyx_tuple__38; +static PyObject *__pyx_tuple__39; +static PyObject *__pyx_tuple__40; +static PyObject *__pyx_tuple__41; +static PyObject *__pyx_tuple__42; +static PyObject *__pyx_tuple__43; +static PyObject *__pyx_tuple__44; +static PyObject *__pyx_tuple__45; +static PyObject *__pyx_tuple__46; +static PyObject *__pyx_tuple__47; +static PyObject *__pyx_tuple__48; +static PyObject *__pyx_tuple__49; +static PyObject *__pyx_tuple__50; +static PyObject *__pyx_tuple__51; +static PyObject *__pyx_tuple__52; +static PyObject *__pyx_tuple__53; +static PyObject *__pyx_tuple__54; +static PyObject *__pyx_tuple__55; +static PyObject *__pyx_tuple__56; +static PyObject *__pyx_tuple__57; +static PyObject *__pyx_tuple__58; +static PyObject *__pyx_tuple__59; +static PyObject *__pyx_tuple__60; +static PyObject *__pyx_tuple__61; +static PyObject *__pyx_tuple__62; +static PyObject *__pyx_tuple__63; +static PyObject *__pyx_tuple__64; +static PyObject *__pyx_tuple__65; +static PyObject *__pyx_tuple__66; +static PyObject *__pyx_tuple__67; +static PyObject *__pyx_tuple__68; +static PyObject *__pyx_tuple__69; +static PyObject *__pyx_tuple__70; +static PyObject *__pyx_tuple__71; +static PyObject *__pyx_tuple__72; +static PyObject *__pyx_tuple__74; +static PyObject *__pyx_codeobj__73; +static PyObject *__pyx_codeobj__75; + +/* "_yaml.pyx":4 + * import yaml + * + * def get_version_string(): # <<<<<<<<<<<<<< + * cdef char *value + * value = yaml_get_version_string() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_1get_version_string(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_5_yaml_1get_version_string = {__Pyx_NAMESTR("get_version_string"), (PyCFunction)__pyx_pw_5_yaml_1get_version_string, METH_NOARGS, __Pyx_DOCSTR(0)}; +static PyObject *__pyx_pw_5_yaml_1get_version_string(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_version_string (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_get_version_string(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_get_version_string(CYTHON_UNUSED PyObject *__pyx_self) { + char *__pyx_v_value; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_version_string", 0); + + /* "_yaml.pyx":6 + * def get_version_string(): + * cdef char *value + * value = yaml_get_version_string() # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * return value + */ + __pyx_v_value = yaml_get_version_string(); + + /* "_yaml.pyx":7 + * cdef char *value + * value = yaml_get_version_string() + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * return value + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":8 + * value = yaml_get_version_string() + * if PY_MAJOR_VERSION < 3: + * return value # <<<<<<<<<<<<<< + * else: + * return PyUnicode_FromString(value) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + /*else*/ { + + /* "_yaml.pyx":10 + * return value + * else: + * return PyUnicode_FromString(value) # <<<<<<<<<<<<<< + * + * def get_version(): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = PyUnicode_FromString(__pyx_v_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + + /* "_yaml.pyx":4 + * import yaml + * + * def get_version_string(): # <<<<<<<<<<<<<< + * cdef char *value + * value = yaml_get_version_string() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_yaml.get_version_string", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":12 + * return PyUnicode_FromString(value) + * + * def get_version(): # <<<<<<<<<<<<<< + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_3get_version(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyMethodDef __pyx_mdef_5_yaml_3get_version = {__Pyx_NAMESTR("get_version"), (PyCFunction)__pyx_pw_5_yaml_3get_version, METH_NOARGS, __Pyx_DOCSTR(0)}; +static PyObject *__pyx_pw_5_yaml_3get_version(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_version (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_2get_version(__pyx_self); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_2get_version(CYTHON_UNUSED PyObject *__pyx_self) { + int __pyx_v_major; + int __pyx_v_minor; + int __pyx_v_patch; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_version", 0); + + /* "_yaml.pyx":14 + * def get_version(): + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) # <<<<<<<<<<<<<< + * return (major, minor, patch) + * + */ + yaml_get_version((&__pyx_v_major), (&__pyx_v_minor), (&__pyx_v_patch)); + + /* "_yaml.pyx":15 + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) + * return (major, minor, patch) # <<<<<<<<<<<<<< + * + * #Mark = yaml.error.Mark + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_major); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_minor); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_patch); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "_yaml.pyx":12 + * return PyUnicode_FromString(value) + * + * def get_version(): # <<<<<<<<<<<<<< + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.get_version", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":72 + * cdef readonly pointer + * + * def __init__(self, object name, int index, int line, int column, # <<<<<<<<<<<<<< + * object buffer, object pointer): + * self.name = name + */ + +/* Python wrapper */ +static int __pyx_pw_5_yaml_4Mark_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_5_yaml_4Mark_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_name = 0; + int __pyx_v_index; + int __pyx_v_line; + int __pyx_v_column; + PyObject *__pyx_v_buffer = 0; + PyObject *__pyx_v_pointer = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_name,&__pyx_n_s_index,&__pyx_n_s_line,&__pyx_n_s_column,&__pyx_n_s_buffer,&__pyx_n_s_pointer,0}; + PyObject* values[6] = {0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_index)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 2: + if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_line)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 3: + if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_column)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 4: + if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_buffer)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + case 5: + if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pointer)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 6) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + } + __pyx_v_name = values[0]; + __pyx_v_index = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_index == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_line = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_line == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_column = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_column == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_v_buffer = values[4]; + __pyx_v_pointer = values[5]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_yaml.Mark.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_5_yaml_4Mark___init__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self), __pyx_v_name, __pyx_v_index, __pyx_v_line, __pyx_v_column, __pyx_v_buffer, __pyx_v_pointer); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5_yaml_4Mark___init__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self, PyObject *__pyx_v_name, int __pyx_v_index, int __pyx_v_line, int __pyx_v_column, PyObject *__pyx_v_buffer, PyObject *__pyx_v_pointer) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__", 0); + + /* "_yaml.pyx":74 + * def __init__(self, object name, int index, int line, int column, + * object buffer, object pointer): + * self.name = name # <<<<<<<<<<<<<< + * self.index = index + * self.line = line + */ + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_v_name; + + /* "_yaml.pyx":75 + * object buffer, object pointer): + * self.name = name + * self.index = index # <<<<<<<<<<<<<< + * self.line = line + * self.column = column + */ + __pyx_v_self->index = __pyx_v_index; + + /* "_yaml.pyx":76 + * self.name = name + * self.index = index + * self.line = line # <<<<<<<<<<<<<< + * self.column = column + * self.buffer = buffer + */ + __pyx_v_self->line = __pyx_v_line; + + /* "_yaml.pyx":77 + * self.index = index + * self.line = line + * self.column = column # <<<<<<<<<<<<<< + * self.buffer = buffer + * self.pointer = pointer + */ + __pyx_v_self->column = __pyx_v_column; + + /* "_yaml.pyx":78 + * self.line = line + * self.column = column + * self.buffer = buffer # <<<<<<<<<<<<<< + * self.pointer = pointer + * + */ + __Pyx_INCREF(__pyx_v_buffer); + __Pyx_GIVEREF(__pyx_v_buffer); + __Pyx_GOTREF(__pyx_v_self->buffer); + __Pyx_DECREF(__pyx_v_self->buffer); + __pyx_v_self->buffer = __pyx_v_buffer; + + /* "_yaml.pyx":79 + * self.column = column + * self.buffer = buffer + * self.pointer = pointer # <<<<<<<<<<<<<< + * + * def get_snippet(self): + */ + __Pyx_INCREF(__pyx_v_pointer); + __Pyx_GIVEREF(__pyx_v_pointer); + __Pyx_GOTREF(__pyx_v_self->pointer); + __Pyx_DECREF(__pyx_v_self->pointer); + __pyx_v_self->pointer = __pyx_v_pointer; + + /* "_yaml.pyx":72 + * cdef readonly pointer + * + * def __init__(self, object name, int index, int line, int column, # <<<<<<<<<<<<<< + * object buffer, object pointer): + * self.name = name + */ + + /* function exit code */ + __pyx_r = 0; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":81 + * self.pointer = pointer + * + * def get_snippet(self): # <<<<<<<<<<<<<< + * return None + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_3get_snippet(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_3get_snippet(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_snippet (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_2get_snippet(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_2get_snippet(CYTHON_UNUSED struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_snippet", 0); + + /* "_yaml.pyx":82 + * + * def get_snippet(self): + * return None # <<<<<<<<<<<<<< + * + * def __str__(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + + /* "_yaml.pyx":81 + * self.pointer = pointer + * + * def get_snippet(self): # <<<<<<<<<<<<<< + * return None + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":84 + * return None + * + * def __str__(self): # <<<<<<<<<<<<<< + * where = " in \"%s\", line %d, column %d" \ + * % (self.name, self.line+1, self.column+1) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_5__str__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_5__str__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__str__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_4__str__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_4__str__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_v_where = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__str__", 0); + + /* "_yaml.pyx":86 + * def __str__(self): + * where = " in \"%s\", line %d, column %d" \ + * % (self.name, self.line+1, self.column+1) # <<<<<<<<<<<<<< + * return where + * + */ + __pyx_t_1 = __Pyx_PyInt_From_long((__pyx_v_self->line + 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_self->column + 1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_in_s_line_d_column_d, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_where = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":87 + * where = " in \"%s\", line %d, column %d" \ + * % (self.name, self.line+1, self.column+1) + * return where # <<<<<<<<<<<<<< + * + * #class YAMLError(Exception): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_where); + __pyx_r = __pyx_v_where; + goto __pyx_L0; + + /* "_yaml.pyx":84 + * return None + * + * def __str__(self): # <<<<<<<<<<<<<< + * where = " in \"%s\", line %d, column %d" \ + * % (self.name, self.line+1, self.column+1) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.Mark.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_where); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":65 + * + * cdef class Mark: + * cdef readonly object name # <<<<<<<<<<<<<< + * cdef readonly int index + * cdef readonly int line + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_4name_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_4name_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_4name___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_4name___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->name); + __pyx_r = __pyx_v_self->name; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":66 + * cdef class Mark: + * cdef readonly object name + * cdef readonly int index # <<<<<<<<<<<<<< + * cdef readonly int line + * cdef readonly int column + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_5index_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_5index_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_5index___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_5index___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_yaml.Mark.index.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":67 + * cdef readonly object name + * cdef readonly int index + * cdef readonly int line # <<<<<<<<<<<<<< + * cdef readonly int column + * cdef readonly buffer + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_4line_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_4line_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_4line___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_4line___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->line); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_yaml.Mark.line.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":68 + * cdef readonly int index + * cdef readonly int line + * cdef readonly int column # <<<<<<<<<<<<<< + * cdef readonly buffer + * cdef readonly pointer + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_6column_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_6column_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_6column___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_6column___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->column); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_yaml.Mark.column.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":69 + * cdef readonly int line + * cdef readonly int column + * cdef readonly buffer # <<<<<<<<<<<<<< + * cdef readonly pointer + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_6buffer_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_6buffer_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_6buffer___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_6buffer___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->buffer); + __pyx_r = __pyx_v_self->buffer; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":70 + * cdef readonly int column + * cdef readonly buffer + * cdef readonly pointer # <<<<<<<<<<<<<< + * + * def __init__(self, object name, int index, int line, int column, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_4Mark_7pointer_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_5_yaml_4Mark_7pointer_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_4Mark_7pointer___get__(((struct __pyx_obj_5_yaml_Mark *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_4Mark_7pointer___get__(struct __pyx_obj_5_yaml_Mark *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->pointer); + __pyx_r = __pyx_v_self->pointer; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":262 + * cdef int unicode_source + * + * def __init__(self, stream): # <<<<<<<<<<<<<< + * cdef is_readable + * if yaml_parser_initialize(&self.parser) == 0: + */ + +/* Python wrapper */ +static int __pyx_pw_5_yaml_7CParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_5_yaml_7CParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_stream = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_stream,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_stream)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_stream = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 262; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_yaml.CParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_5_yaml_7CParser___init__(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self), __pyx_v_stream); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5_yaml_7CParser___init__(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_stream) { + PyObject *__pyx_v_is_readable = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + __Pyx_INCREF(__pyx_v_stream); + + /* "_yaml.pyx":264 + * def __init__(self, stream): + * cdef is_readable + * if yaml_parser_initialize(&self.parser) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * self.parsed_event.type = YAML_NO_EVENT + */ + __pyx_t_1 = ((yaml_parser_initialize((&__pyx_v_self->parser)) == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":265 + * cdef is_readable + * if yaml_parser_initialize(&self.parser) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * self.parsed_event.type = YAML_NO_EVENT + * is_readable = 1 + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":266 + * if yaml_parser_initialize(&self.parser) == 0: + * raise MemoryError + * self.parsed_event.type = YAML_NO_EVENT # <<<<<<<<<<<<<< + * is_readable = 1 + * try: + */ + __pyx_v_self->parsed_event.type = YAML_NO_EVENT; + + /* "_yaml.pyx":267 + * raise MemoryError + * self.parsed_event.type = YAML_NO_EVENT + * is_readable = 1 # <<<<<<<<<<<<<< + * try: + * stream.read + */ + __Pyx_INCREF(__pyx_int_1); + __pyx_v_is_readable = __pyx_int_1; + + /* "_yaml.pyx":268 + * self.parsed_event.type = YAML_NO_EVENT + * is_readable = 1 + * try: # <<<<<<<<<<<<<< + * stream.read + * except AttributeError: + */ + { + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "_yaml.pyx":269 + * is_readable = 1 + * try: + * stream.read # <<<<<<<<<<<<<< + * except AttributeError: + * is_readable = 0 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_stream, __pyx_n_s_read); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 269; __pyx_clineno = __LINE__; goto __pyx_L4_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L11_try_end; + __pyx_L4_error:; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_yaml.pyx":270 + * try: + * stream.read + * except AttributeError: # <<<<<<<<<<<<<< + * is_readable = 0 + * self.unicode_source = 0 + */ + __pyx_t_6 = PyErr_ExceptionMatches(__pyx_builtin_AttributeError); + if (__pyx_t_6) { + __Pyx_AddTraceback("_yaml.CParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_7, &__pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + + /* "_yaml.pyx":271 + * stream.read + * except AttributeError: + * is_readable = 0 # <<<<<<<<<<<<<< + * self.unicode_source = 0 + * if is_readable: + */ + __Pyx_INCREF(__pyx_int_0); + __Pyx_DECREF_SET(__pyx_v_is_readable, __pyx_int_0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + goto __pyx_L5_exception_handled; + } + goto __pyx_L6_except_error; + __pyx_L6_except_error:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L5_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + __pyx_L11_try_end:; + } + + /* "_yaml.pyx":272 + * except AttributeError: + * is_readable = 0 + * self.unicode_source = 0 # <<<<<<<<<<<<<< + * if is_readable: + * self.stream = stream + */ + __pyx_v_self->unicode_source = 0; + + /* "_yaml.pyx":273 + * is_readable = 0 + * self.unicode_source = 0 + * if is_readable: # <<<<<<<<<<<<<< + * self.stream = stream + * try: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_is_readable); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 273; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":274 + * self.unicode_source = 0 + * if is_readable: + * self.stream = stream # <<<<<<<<<<<<<< + * try: + * self.stream_name = stream.name + */ + __Pyx_INCREF(__pyx_v_stream); + __Pyx_GIVEREF(__pyx_v_stream); + __Pyx_GOTREF(__pyx_v_self->stream); + __Pyx_DECREF(__pyx_v_self->stream); + __pyx_v_self->stream = __pyx_v_stream; + + /* "_yaml.pyx":275 + * if is_readable: + * self.stream = stream + * try: # <<<<<<<<<<<<<< + * self.stream_name = stream.name + * except AttributeError: + */ + { + __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_3, &__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_2); + /*try:*/ { + + /* "_yaml.pyx":276 + * self.stream = stream + * try: + * self.stream_name = stream.name # <<<<<<<<<<<<<< + * except AttributeError: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_stream, __pyx_n_s_name); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L15_error;} + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GIVEREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_t_8; + __pyx_t_8 = 0; + } + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L22_try_end; + __pyx_L15_error:; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "_yaml.pyx":277 + * try: + * self.stream_name = stream.name + * except AttributeError: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * self.stream_name = '' + */ + __pyx_t_6 = PyErr_ExceptionMatches(__pyx_builtin_AttributeError); + if (__pyx_t_6) { + __Pyx_AddTraceback("_yaml.CParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_7, &__pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 277; __pyx_clineno = __LINE__; goto __pyx_L17_except_error;} + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":278 + * self.stream_name = stream.name + * except AttributeError: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * self.stream_name = '' + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":279 + * except AttributeError: + * if PY_MAJOR_VERSION < 3: + * self.stream_name = '' # <<<<<<<<<<<<<< + * else: + * self.stream_name = u'' + */ + __Pyx_INCREF(__pyx_kp_s_file); + __Pyx_GIVEREF(__pyx_kp_s_file); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_s_file; + goto __pyx_L25; + } + /*else*/ { + + /* "_yaml.pyx":281 + * self.stream_name = '' + * else: + * self.stream_name = u'' # <<<<<<<<<<<<<< + * self.stream_cache = None + * self.stream_cache_len = 0 + */ + __Pyx_INCREF(__pyx_kp_u_file); + __Pyx_GIVEREF(__pyx_kp_u_file); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_u_file; + } + __pyx_L25:; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L16_exception_handled; + } + goto __pyx_L17_except_error; + __pyx_L17_except_error:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_3, __pyx_t_2); + goto __pyx_L1_error; + __pyx_L16_exception_handled:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_3, __pyx_t_2); + __pyx_L22_try_end:; + } + + /* "_yaml.pyx":282 + * else: + * self.stream_name = u'' + * self.stream_cache = None # <<<<<<<<<<<<<< + * self.stream_cache_len = 0 + * self.stream_cache_pos = 0 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->stream_cache); + __Pyx_DECREF(__pyx_v_self->stream_cache); + __pyx_v_self->stream_cache = Py_None; + + /* "_yaml.pyx":283 + * self.stream_name = u'' + * self.stream_cache = None + * self.stream_cache_len = 0 # <<<<<<<<<<<<<< + * self.stream_cache_pos = 0 + * yaml_parser_set_input(&self.parser, input_handler, self) + */ + __pyx_v_self->stream_cache_len = 0; + + /* "_yaml.pyx":284 + * self.stream_cache = None + * self.stream_cache_len = 0 + * self.stream_cache_pos = 0 # <<<<<<<<<<<<<< + * yaml_parser_set_input(&self.parser, input_handler, self) + * else: + */ + __pyx_v_self->stream_cache_pos = 0; + + /* "_yaml.pyx":285 + * self.stream_cache_len = 0 + * self.stream_cache_pos = 0 + * yaml_parser_set_input(&self.parser, input_handler, self) # <<<<<<<<<<<<<< + * else: + * if PyUnicode_CheckExact(stream) != 0: + */ + yaml_parser_set_input((&__pyx_v_self->parser), __pyx_f_5_yaml_input_handler, ((void *)__pyx_v_self)); + goto __pyx_L14; + } + /*else*/ { + + /* "_yaml.pyx":287 + * yaml_parser_set_input(&self.parser, input_handler, self) + * else: + * if PyUnicode_CheckExact(stream) != 0: # <<<<<<<<<<<<<< + * stream = PyUnicode_AsUTF8String(stream) + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_1 = ((PyUnicode_CheckExact(__pyx_v_stream) != 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":288 + * else: + * if PyUnicode_CheckExact(stream) != 0: + * stream = PyUnicode_AsUTF8String(stream) # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * self.stream_name = '' + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_stream); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 288; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_stream, __pyx_t_5); + __pyx_t_5 = 0; + + /* "_yaml.pyx":289 + * if PyUnicode_CheckExact(stream) != 0: + * stream = PyUnicode_AsUTF8String(stream) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * self.stream_name = '' + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":290 + * stream = PyUnicode_AsUTF8String(stream) + * if PY_MAJOR_VERSION < 3: + * self.stream_name = '' # <<<<<<<<<<<<<< + * else: + * self.stream_name = u'' + */ + __Pyx_INCREF(__pyx_kp_s_unicode_string); + __Pyx_GIVEREF(__pyx_kp_s_unicode_string); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_s_unicode_string; + goto __pyx_L27; + } + /*else*/ { + + /* "_yaml.pyx":292 + * self.stream_name = '' + * else: + * self.stream_name = u'' # <<<<<<<<<<<<<< + * self.unicode_source = 1 + * else: + */ + __Pyx_INCREF(__pyx_kp_u_unicode_string); + __Pyx_GIVEREF(__pyx_kp_u_unicode_string); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_u_unicode_string; + } + __pyx_L27:; + + /* "_yaml.pyx":293 + * else: + * self.stream_name = u'' + * self.unicode_source = 1 # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_v_self->unicode_source = 1; + goto __pyx_L26; + } + /*else*/ { + + /* "_yaml.pyx":295 + * self.unicode_source = 1 + * else: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * self.stream_name = '' + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":296 + * else: + * if PY_MAJOR_VERSION < 3: + * self.stream_name = '' # <<<<<<<<<<<<<< + * else: + * self.stream_name = u'' + */ + __Pyx_INCREF(__pyx_kp_s_byte_string); + __Pyx_GIVEREF(__pyx_kp_s_byte_string); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_s_byte_string; + goto __pyx_L28; + } + /*else*/ { + + /* "_yaml.pyx":298 + * self.stream_name = '' + * else: + * self.stream_name = u'' # <<<<<<<<<<<<<< + * if PyString_CheckExact(stream) == 0: + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_INCREF(__pyx_kp_u_byte_string); + __Pyx_GIVEREF(__pyx_kp_u_byte_string); + __Pyx_GOTREF(__pyx_v_self->stream_name); + __Pyx_DECREF(__pyx_v_self->stream_name); + __pyx_v_self->stream_name = __pyx_kp_u_byte_string; + } + __pyx_L28:; + } + __pyx_L26:; + + /* "_yaml.pyx":299 + * else: + * self.stream_name = u'' + * if PyString_CheckExact(stream) == 0: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string or stream input is required") + */ + __pyx_t_1 = ((PyString_CheckExact(__pyx_v_stream) == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":300 + * self.stream_name = u'' + * if PyString_CheckExact(stream) == 0: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("a string or stream input is required") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":301 + * if PyString_CheckExact(stream) == 0: + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string or stream input is required") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"a string or stream input is required") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":303 + * raise TypeError("a string or stream input is required") + * else: + * raise TypeError(u"a string or stream input is required") # <<<<<<<<<<<<<< + * self.stream = stream + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":304 + * else: + * raise TypeError(u"a string or stream input is required") + * self.stream = stream # <<<<<<<<<<<<<< + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + * self.current_token = None + */ + __Pyx_INCREF(__pyx_v_stream); + __Pyx_GIVEREF(__pyx_v_stream); + __Pyx_GOTREF(__pyx_v_self->stream); + __Pyx_DECREF(__pyx_v_self->stream); + __pyx_v_self->stream = __pyx_v_stream; + + /* "_yaml.pyx":305 + * raise TypeError(u"a string or stream input is required") + * self.stream = stream + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) # <<<<<<<<<<<<<< + * self.current_token = None + * self.current_event = None + */ + yaml_parser_set_input_string((&__pyx_v_self->parser), PyString_AS_STRING(__pyx_v_stream), PyString_GET_SIZE(__pyx_v_stream)); + } + __pyx_L14:; + + /* "_yaml.pyx":306 + * self.stream = stream + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + * self.current_token = None # <<<<<<<<<<<<<< + * self.current_event = None + * self.anchors = {} + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->current_token); + __Pyx_DECREF(__pyx_v_self->current_token); + __pyx_v_self->current_token = Py_None; + + /* "_yaml.pyx":307 + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + * self.current_token = None + * self.current_event = None # <<<<<<<<<<<<<< + * self.anchors = {} + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->current_event); + __Pyx_DECREF(__pyx_v_self->current_event); + __pyx_v_self->current_event = Py_None; + + /* "_yaml.pyx":308 + * self.current_token = None + * self.current_event = None + * self.anchors = {} # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_v_self->anchors); + __Pyx_DECREF(__pyx_v_self->anchors); + __pyx_v_self->anchors = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":262 + * cdef int unicode_source + * + * def __init__(self, stream): # <<<<<<<<<<<<<< + * cdef is_readable + * if yaml_parser_initialize(&self.parser) == 0: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("_yaml.CParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_is_readable); + __Pyx_XDECREF(__pyx_v_stream); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":310 + * self.anchors = {} + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * yaml_parser_delete(&self.parser) + * yaml_event_delete(&self.parsed_event) + */ + +/* Python wrapper */ +static void __pyx_pw_5_yaml_7CParser_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_5_yaml_7CParser_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_5_yaml_7CParser_2__dealloc__(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5_yaml_7CParser_2__dealloc__(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "_yaml.pyx":311 + * + * def __dealloc__(self): + * yaml_parser_delete(&self.parser) # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * + */ + yaml_parser_delete((&__pyx_v_self->parser)); + + /* "_yaml.pyx":312 + * def __dealloc__(self): + * yaml_parser_delete(&self.parser) + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * + * def dispose(self): + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":310 + * self.anchors = {} + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * yaml_parser_delete(&self.parser) + * yaml_event_delete(&self.parsed_event) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "_yaml.pyx":314 + * yaml_event_delete(&self.parsed_event) + * + * def dispose(self): # <<<<<<<<<<<<<< + * pass + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_5dispose(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_5dispose(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("dispose (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_4dispose(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_4dispose(CYTHON_UNUSED struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("dispose", 0); + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":317 + * pass + * + * cdef object _parser_error(self): # <<<<<<<<<<<<<< + * if self.parser.error == YAML_MEMORY_ERROR: + * return MemoryError + */ + +static PyObject *__pyx_f_5_yaml_7CParser__parser_error(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_context_mark = NULL; + PyObject *__pyx_v_problem_mark = NULL; + PyObject *__pyx_v_context = NULL; + PyObject *__pyx_v_problem = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_parser_error", 0); + + /* "_yaml.pyx":327 + * return ReaderError(self.stream_name, self.parser.problem_offset, + * self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) + * elif self.parser.error == YAML_SCANNER_ERROR \ # <<<<<<<<<<<<<< + * or self.parser.error == YAML_PARSER_ERROR: + * context_mark = None + */ + switch (__pyx_v_self->parser.error) { + + /* "_yaml.pyx":318 + * + * cdef object _parser_error(self): + * if self.parser.error == YAML_MEMORY_ERROR: # <<<<<<<<<<<<<< + * return MemoryError + * elif self.parser.error == YAML_READER_ERROR: + */ + case YAML_MEMORY_ERROR: + + /* "_yaml.pyx":319 + * cdef object _parser_error(self): + * if self.parser.error == YAML_MEMORY_ERROR: + * return MemoryError # <<<<<<<<<<<<<< + * elif self.parser.error == YAML_READER_ERROR: + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_builtin_MemoryError); + __pyx_r = __pyx_builtin_MemoryError; + goto __pyx_L0; + break; + + /* "_yaml.pyx":320 + * if self.parser.error == YAML_MEMORY_ERROR: + * return MemoryError + * elif self.parser.error == YAML_READER_ERROR: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * return ReaderError(self.stream_name, self.parser.problem_offset, + */ + case YAML_READER_ERROR: + + /* "_yaml.pyx":321 + * return MemoryError + * elif self.parser.error == YAML_READER_ERROR: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * return ReaderError(self.stream_name, self.parser.problem_offset, + * self.parser.problem_value, '?', self.parser.problem) + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":322 + * elif self.parser.error == YAML_READER_ERROR: + * if PY_MAJOR_VERSION < 3: + * return ReaderError(self.stream_name, self.parser.problem_offset, # <<<<<<<<<<<<<< + * self.parser.problem_value, '?', self.parser.problem) + * else: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_ReaderError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_offset); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":323 + * if PY_MAJOR_VERSION < 3: + * return ReaderError(self.stream_name, self.parser.problem_offset, + * self.parser.problem_value, '?', self.parser.problem) # <<<<<<<<<<<<<< + * else: + * return ReaderError(self.stream_name, self.parser.problem_offset, + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyBytes_FromString(__pyx_v_self->parser.problem); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":322 + * elif self.parser.error == YAML_READER_ERROR: + * if PY_MAJOR_VERSION < 3: + * return ReaderError(self.stream_name, self.parser.problem_offset, # <<<<<<<<<<<<<< + * self.parser.problem_value, '?', self.parser.problem) + * else: + */ + __pyx_t_6 = PyTuple_New(5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(__pyx_kp_s__3); + PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_kp_s__3); + __Pyx_GIVEREF(__pyx_kp_s__3); + PyTuple_SET_ITEM(__pyx_t_6, 4, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + } + /*else*/ { + + /* "_yaml.pyx":325 + * self.parser.problem_value, '?', self.parser.problem) + * else: + * return ReaderError(self.stream_name, self.parser.problem_offset, # <<<<<<<<<<<<<< + * self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) + * elif self.parser.error == YAML_SCANNER_ERROR \ + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ReaderError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_offset); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + + /* "_yaml.pyx":326 + * else: + * return ReaderError(self.stream_name, self.parser.problem_offset, + * self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) # <<<<<<<<<<<<<< + * elif self.parser.error == YAML_SCANNER_ERROR \ + * or self.parser.error == YAML_PARSER_ERROR: + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyUnicode_FromString(__pyx_v_self->parser.problem); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":325 + * self.parser.problem_value, '?', self.parser.problem) + * else: + * return ReaderError(self.stream_name, self.parser.problem_offset, # <<<<<<<<<<<<<< + * self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) + * elif self.parser.error == YAML_SCANNER_ERROR \ + */ + __pyx_t_3 = PyTuple_New(5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(__pyx_kp_u__3); + PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_kp_u__3); + __Pyx_GIVEREF(__pyx_kp_u__3); + PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_6 = 0; + __pyx_t_2 = 0; + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 325; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + break; + + /* "_yaml.pyx":328 + * self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) + * elif self.parser.error == YAML_SCANNER_ERROR \ + * or self.parser.error == YAML_PARSER_ERROR: # <<<<<<<<<<<<<< + * context_mark = None + * problem_mark = None + */ + case YAML_SCANNER_ERROR: + case YAML_PARSER_ERROR: + + /* "_yaml.pyx":329 + * elif self.parser.error == YAML_SCANNER_ERROR \ + * or self.parser.error == YAML_PARSER_ERROR: + * context_mark = None # <<<<<<<<<<<<<< + * problem_mark = None + * if self.parser.context != NULL: + */ + __Pyx_INCREF(Py_None); + __pyx_v_context_mark = Py_None; + + /* "_yaml.pyx":330 + * or self.parser.error == YAML_PARSER_ERROR: + * context_mark = None + * problem_mark = None # <<<<<<<<<<<<<< + * if self.parser.context != NULL: + * context_mark = Mark(self.stream_name, + */ + __Pyx_INCREF(Py_None); + __pyx_v_problem_mark = Py_None; + + /* "_yaml.pyx":331 + * context_mark = None + * problem_mark = None + * if self.parser.context != NULL: # <<<<<<<<<<<<<< + * context_mark = Mark(self.stream_name, + * self.parser.context_mark.index, + */ + __pyx_t_1 = ((__pyx_v_self->parser.context != NULL) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":333 + * if self.parser.context != NULL: + * context_mark = Mark(self.stream_name, + * self.parser.context_mark.index, # <<<<<<<<<<<<<< + * self.parser.context_mark.line, + * self.parser.context_mark.column, None, None) + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->parser.context_mark.index); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":334 + * context_mark = Mark(self.stream_name, + * self.parser.context_mark.index, + * self.parser.context_mark.line, # <<<<<<<<<<<<<< + * self.parser.context_mark.column, None, None) + * if self.parser.problem != NULL: + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parser.context_mark.line); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":335 + * self.parser.context_mark.index, + * self.parser.context_mark.line, + * self.parser.context_mark.column, None, None) # <<<<<<<<<<<<<< + * if self.parser.problem != NULL: + * problem_mark = Mark(self.stream_name, + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->parser.context_mark.column); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":332 + * problem_mark = None + * if self.parser.context != NULL: + * context_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parser.context_mark.index, + * self.parser.context_mark.line, + */ + __pyx_t_2 = PyTuple_New(6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_2, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_2, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_4 = 0; + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_context_mark, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":336 + * self.parser.context_mark.line, + * self.parser.context_mark.column, None, None) + * if self.parser.problem != NULL: # <<<<<<<<<<<<<< + * problem_mark = Mark(self.stream_name, + * self.parser.problem_mark.index, + */ + __pyx_t_1 = ((__pyx_v_self->parser.problem != NULL) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":338 + * if self.parser.problem != NULL: + * problem_mark = Mark(self.stream_name, + * self.parser.problem_mark.index, # <<<<<<<<<<<<<< + * self.parser.problem_mark.line, + * self.parser.problem_mark.column, None, None) + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_mark.index); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":339 + * problem_mark = Mark(self.stream_name, + * self.parser.problem_mark.index, + * self.parser.problem_mark.line, # <<<<<<<<<<<<<< + * self.parser.problem_mark.column, None, None) + * context = None + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":340 + * self.parser.problem_mark.index, + * self.parser.problem_mark.line, + * self.parser.problem_mark.column, None, None) # <<<<<<<<<<<<<< + * context = None + * if self.parser.context != NULL: + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parser.problem_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":337 + * self.parser.context_mark.column, None, None) + * if self.parser.problem != NULL: + * problem_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parser.problem_mark.index, + * self.parser.problem_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_5 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF_SET(__pyx_v_problem_mark, __pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":341 + * self.parser.problem_mark.line, + * self.parser.problem_mark.column, None, None) + * context = None # <<<<<<<<<<<<<< + * if self.parser.context != NULL: + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_INCREF(Py_None); + __pyx_v_context = Py_None; + + /* "_yaml.pyx":342 + * self.parser.problem_mark.column, None, None) + * context = None + * if self.parser.context != NULL: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * context = self.parser.context + */ + __pyx_t_1 = ((__pyx_v_self->parser.context != NULL) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":343 + * context = None + * if self.parser.context != NULL: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * context = self.parser.context + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":344 + * if self.parser.context != NULL: + * if PY_MAJOR_VERSION < 3: + * context = self.parser.context # <<<<<<<<<<<<<< + * else: + * context = PyUnicode_FromString(self.parser.context) + */ + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->parser.context); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_context, __pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L7; + } + /*else*/ { + + /* "_yaml.pyx":346 + * context = self.parser.context + * else: + * context = PyUnicode_FromString(self.parser.context) # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * problem = self.parser.problem + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_self->parser.context); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_context, __pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L7:; + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":347 + * else: + * context = PyUnicode_FromString(self.parser.context) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * problem = self.parser.problem + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":348 + * context = PyUnicode_FromString(self.parser.context) + * if PY_MAJOR_VERSION < 3: + * problem = self.parser.problem # <<<<<<<<<<<<<< + * else: + * problem = PyUnicode_FromString(self.parser.problem) + */ + __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_self->parser.problem); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_problem = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L8; + } + /*else*/ { + + /* "_yaml.pyx":350 + * problem = self.parser.problem + * else: + * problem = PyUnicode_FromString(self.parser.problem) # <<<<<<<<<<<<<< + * if self.parser.error == YAML_SCANNER_ERROR: + * return ScannerError(context, context_mark, problem, problem_mark) + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_self->parser.problem); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 350; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_problem = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "_yaml.pyx":351 + * else: + * problem = PyUnicode_FromString(self.parser.problem) + * if self.parser.error == YAML_SCANNER_ERROR: # <<<<<<<<<<<<<< + * return ScannerError(context, context_mark, problem, problem_mark) + * else: + */ + __pyx_t_1 = ((__pyx_v_self->parser.error == YAML_SCANNER_ERROR) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":352 + * problem = PyUnicode_FromString(self.parser.problem) + * if self.parser.error == YAML_SCANNER_ERROR: + * return ScannerError(context, context_mark, problem, problem_mark) # <<<<<<<<<<<<<< + * else: + * return ParserError(context, context_mark, problem, problem_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScannerError); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_context); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_context); + __Pyx_GIVEREF(__pyx_v_context); + __Pyx_INCREF(__pyx_v_context_mark); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_context_mark); + __Pyx_GIVEREF(__pyx_v_context_mark); + __Pyx_INCREF(__pyx_v_problem); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_problem); + __Pyx_GIVEREF(__pyx_v_problem); + __Pyx_INCREF(__pyx_v_problem_mark); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_problem_mark); + __Pyx_GIVEREF(__pyx_v_problem_mark); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + } + /*else*/ { + + /* "_yaml.pyx":354 + * return ScannerError(context, context_mark, problem, problem_mark) + * else: + * return ParserError(context, context_mark, problem, problem_mark) # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no parser error") + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_ParserError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_context); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_context); + __Pyx_GIVEREF(__pyx_v_context); + __Pyx_INCREF(__pyx_v_context_mark); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_context_mark); + __Pyx_GIVEREF(__pyx_v_context_mark); + __Pyx_INCREF(__pyx_v_problem); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_problem); + __Pyx_GIVEREF(__pyx_v_problem); + __Pyx_INCREF(__pyx_v_problem_mark); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_v_problem_mark); + __Pyx_GIVEREF(__pyx_v_problem_mark); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + break; + default: break; + } + + /* "_yaml.pyx":355 + * else: + * return ParserError(context, context_mark, problem, problem_mark) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("no parser error") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":356 + * return ParserError(context, context_mark, problem, problem_mark) + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no parser error") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"no parser error") + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":358 + * raise ValueError("no parser error") + * else: + * raise ValueError(u"no parser error") # <<<<<<<<<<<<<< + * + * def raw_scan(self): + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":317 + * pass + * + * cdef object _parser_error(self): # <<<<<<<<<<<<<< + * if self.parser.error == YAML_MEMORY_ERROR: + * return MemoryError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_yaml.CParser._parser_error", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_context_mark); + __Pyx_XDECREF(__pyx_v_problem_mark); + __Pyx_XDECREF(__pyx_v_context); + __Pyx_XDECREF(__pyx_v_problem); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":360 + * raise ValueError(u"no parser error") + * + * def raw_scan(self): # <<<<<<<<<<<<<< + * cdef yaml_token_t token + * cdef int done + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_7raw_scan(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_7raw_scan(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("raw_scan (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_6raw_scan(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_6raw_scan(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + yaml_token_t __pyx_v_token; + int __pyx_v_done; + int __pyx_v_count; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("raw_scan", 0); + + /* "_yaml.pyx":364 + * cdef int done + * cdef int count + * count = 0 # <<<<<<<<<<<<<< + * done = 0 + * while done == 0: + */ + __pyx_v_count = 0; + + /* "_yaml.pyx":365 + * cdef int count + * count = 0 + * done = 0 # <<<<<<<<<<<<<< + * while done == 0: + * if yaml_parser_scan(&self.parser, &token) == 0: + */ + __pyx_v_done = 0; + + /* "_yaml.pyx":366 + * count = 0 + * done = 0 + * while done == 0: # <<<<<<<<<<<<<< + * if yaml_parser_scan(&self.parser, &token) == 0: + * error = self._parser_error() + */ + while (1) { + __pyx_t_1 = ((__pyx_v_done == 0) != 0); + if (!__pyx_t_1) break; + + /* "_yaml.pyx":367 + * done = 0 + * while done == 0: + * if yaml_parser_scan(&self.parser, &token) == 0: # <<<<<<<<<<<<<< + * error = self._parser_error() + * raise error + */ + __pyx_t_2 = yaml_parser_scan((&__pyx_v_self->parser), (&__pyx_v_token)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_2 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":368 + * while done == 0: + * if yaml_parser_scan(&self.parser, &token) == 0: + * error = self._parser_error() # <<<<<<<<<<<<<< + * raise error + * if token.type == YAML_NO_TOKEN: + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parser_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":369 + * if yaml_parser_scan(&self.parser, &token) == 0: + * error = self._parser_error() + * raise error # <<<<<<<<<<<<<< + * if token.type == YAML_NO_TOKEN: + * done = 1 + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":370 + * error = self._parser_error() + * raise error + * if token.type == YAML_NO_TOKEN: # <<<<<<<<<<<<<< + * done = 1 + * else: + */ + __pyx_t_1 = ((__pyx_v_token.type == YAML_NO_TOKEN) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":371 + * raise error + * if token.type == YAML_NO_TOKEN: + * done = 1 # <<<<<<<<<<<<<< + * else: + * count = count+1 + */ + __pyx_v_done = 1; + goto __pyx_L6; + } + /*else*/ { + + /* "_yaml.pyx":373 + * done = 1 + * else: + * count = count+1 # <<<<<<<<<<<<<< + * yaml_token_delete(&token) + * return count + */ + __pyx_v_count = (__pyx_v_count + 1); + } + __pyx_L6:; + + /* "_yaml.pyx":374 + * else: + * count = count+1 + * yaml_token_delete(&token) # <<<<<<<<<<<<<< + * return count + * + */ + yaml_token_delete((&__pyx_v_token)); + } + + /* "_yaml.pyx":375 + * count = count+1 + * yaml_token_delete(&token) + * return count # <<<<<<<<<<<<<< + * + * cdef object _scan(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_yaml.pyx":360 + * raise ValueError(u"no parser error") + * + * def raw_scan(self): # <<<<<<<<<<<<<< + * cdef yaml_token_t token + * cdef int done + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.raw_scan", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":377 + * return count + * + * cdef object _scan(self): # <<<<<<<<<<<<<< + * cdef yaml_token_t token + * if yaml_parser_scan(&self.parser, &token) == 0: + */ + +static PyObject *__pyx_f_5_yaml_7CParser__scan(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + yaml_token_t __pyx_v_token; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_v_token_object = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_scan", 0); + + /* "_yaml.pyx":379 + * cdef object _scan(self): + * cdef yaml_token_t token + * if yaml_parser_scan(&self.parser, &token) == 0: # <<<<<<<<<<<<<< + * error = self._parser_error() + * raise error + */ + __pyx_t_1 = yaml_parser_scan((&__pyx_v_self->parser), (&__pyx_v_token)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((__pyx_t_1 == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":380 + * cdef yaml_token_t token + * if yaml_parser_scan(&self.parser, &token) == 0: + * error = self._parser_error() # <<<<<<<<<<<<<< + * raise error + * token_object = self._token_to_object(&token) + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parser_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":381 + * if yaml_parser_scan(&self.parser, &token) == 0: + * error = self._parser_error() + * raise error # <<<<<<<<<<<<<< + * token_object = self._token_to_object(&token) + * yaml_token_delete(&token) + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 381; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":382 + * error = self._parser_error() + * raise error + * token_object = self._token_to_object(&token) # <<<<<<<<<<<<<< + * yaml_token_delete(&token) + * return token_object + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_token_to_object(__pyx_v_self, (&__pyx_v_token)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 382; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_token_object = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":383 + * raise error + * token_object = self._token_to_object(&token) + * yaml_token_delete(&token) # <<<<<<<<<<<<<< + * return token_object + * + */ + yaml_token_delete((&__pyx_v_token)); + + /* "_yaml.pyx":384 + * token_object = self._token_to_object(&token) + * yaml_token_delete(&token) + * return token_object # <<<<<<<<<<<<<< + * + * cdef object _token_to_object(self, yaml_token_t *token): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_token_object); + __pyx_r = __pyx_v_token_object; + goto __pyx_L0; + + /* "_yaml.pyx":377 + * return count + * + * cdef object _scan(self): # <<<<<<<<<<<<<< + * cdef yaml_token_t token + * if yaml_parser_scan(&self.parser, &token) == 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser._scan", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XDECREF(__pyx_v_token_object); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":386 + * return token_object + * + * cdef object _token_to_object(self, yaml_token_t *token): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * token.start_mark.index, + */ + +static PyObject *__pyx_f_5_yaml_7CParser__token_to_object(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, yaml_token_t *__pyx_v_token) { + struct __pyx_obj_5_yaml_Mark *__pyx_v_start_mark = NULL; + struct __pyx_obj_5_yaml_Mark *__pyx_v_end_mark = NULL; + PyObject *__pyx_v_encoding = NULL; + PyObject *__pyx_v_handle = NULL; + PyObject *__pyx_v_prefix = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_v_suffix = NULL; + int __pyx_v_plain; + PyObject *__pyx_v_style = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_token_to_object", 0); + + /* "_yaml.pyx":388 + * cdef object _token_to_object(self, yaml_token_t *token): + * start_mark = Mark(self.stream_name, + * token.start_mark.index, # <<<<<<<<<<<<<< + * token.start_mark.line, + * token.start_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_token->start_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":389 + * start_mark = Mark(self.stream_name, + * token.start_mark.index, + * token.start_mark.line, # <<<<<<<<<<<<<< + * token.start_mark.column, + * None, None) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_token->start_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 389; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":390 + * token.start_mark.index, + * token.start_mark.line, + * token.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * end_mark = Mark(self.stream_name, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_token->start_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":387 + * + * cdef object _token_to_object(self, yaml_token_t *token): + * start_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * token.start_mark.index, + * token.start_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_start_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":393 + * None, None) + * end_mark = Mark(self.stream_name, + * token.end_mark.index, # <<<<<<<<<<<<<< + * token.end_mark.line, + * token.end_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_token->end_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":394 + * end_mark = Mark(self.stream_name, + * token.end_mark.index, + * token.end_mark.line, # <<<<<<<<<<<<<< + * token.end_mark.column, + * None, None) + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_token->end_mark.line); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":395 + * token.end_mark.index, + * token.end_mark.line, + * token.end_mark.column, # <<<<<<<<<<<<<< + * None, None) + * if token.type == YAML_NO_TOKEN: + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_token->end_mark.column); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":392 + * token.start_mark.column, + * None, None) + * end_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * token.end_mark.index, + * token.end_mark.line, + */ + __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 392; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_end_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":459 + * handle = None + * return TagToken((handle, suffix), start_mark, end_mark) + * elif token.type == YAML_SCALAR_TOKEN: # <<<<<<<<<<<<<< + * value = PyUnicode_DecodeUTF8(token.data.scalar.value, + * token.data.scalar.length, 'strict') + */ + switch (__pyx_v_token->type) { + + /* "_yaml.pyx":397 + * token.end_mark.column, + * None, None) + * if token.type == YAML_NO_TOKEN: # <<<<<<<<<<<<<< + * return None + * elif token.type == YAML_STREAM_START_TOKEN: + */ + case YAML_NO_TOKEN: + + /* "_yaml.pyx":398 + * None, None) + * if token.type == YAML_NO_TOKEN: + * return None # <<<<<<<<<<<<<< + * elif token.type == YAML_STREAM_START_TOKEN: + * encoding = None + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + break; + + /* "_yaml.pyx":399 + * if token.type == YAML_NO_TOKEN: + * return None + * elif token.type == YAML_STREAM_START_TOKEN: # <<<<<<<<<<<<<< + * encoding = None + * if token.data.stream_start.encoding == YAML_UTF8_ENCODING: + */ + case YAML_STREAM_START_TOKEN: + + /* "_yaml.pyx":400 + * return None + * elif token.type == YAML_STREAM_START_TOKEN: + * encoding = None # <<<<<<<<<<<<<< + * if token.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: + */ + __Pyx_INCREF(Py_None); + __pyx_v_encoding = Py_None; + + /* "_yaml.pyx":401 + * elif token.type == YAML_STREAM_START_TOKEN: + * encoding = None + * if token.data.stream_start.encoding == YAML_UTF8_ENCODING: # <<<<<<<<<<<<<< + * if self.unicode_source == 0: + * encoding = u"utf-8" + */ + __pyx_t_5 = ((__pyx_v_token->data.stream_start.encoding == YAML_UTF8_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":402 + * encoding = None + * if token.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: # <<<<<<<<<<<<<< + * encoding = u"utf-8" + * elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + */ + __pyx_t_5 = ((__pyx_v_self->unicode_source == 0) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":403 + * if token.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: + * encoding = u"utf-8" # <<<<<<<<<<<<<< + * elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" + */ + __Pyx_INCREF(__pyx_kp_u_utf_8); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_8); + goto __pyx_L4; + } + __pyx_L4:; + goto __pyx_L3; + } + + /* "_yaml.pyx":404 + * if self.unicode_source == 0: + * encoding = u"utf-8" + * elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: # <<<<<<<<<<<<<< + * encoding = u"utf-16-le" + * elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + */ + __pyx_t_5 = ((__pyx_v_token->data.stream_start.encoding == YAML_UTF16LE_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":405 + * encoding = u"utf-8" + * elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" # <<<<<<<<<<<<<< + * elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" + */ + __Pyx_INCREF(__pyx_kp_u_utf_16_le); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_16_le); + goto __pyx_L3; + } + + /* "_yaml.pyx":406 + * elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" + * elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: # <<<<<<<<<<<<<< + * encoding = u"utf-16-be" + * return StreamStartToken(start_mark, end_mark, encoding) + */ + __pyx_t_5 = ((__pyx_v_token->data.stream_start.encoding == YAML_UTF16BE_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":407 + * encoding = u"utf-16-le" + * elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" # <<<<<<<<<<<<<< + * return StreamStartToken(start_mark, end_mark, encoding) + * elif token.type == YAML_STREAM_END_TOKEN: + */ + __Pyx_INCREF(__pyx_kp_u_utf_16_be); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_16_be); + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":408 + * elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" + * return StreamStartToken(start_mark, end_mark, encoding) # <<<<<<<<<<<<<< + * elif token.type == YAML_STREAM_END_TOKEN: + * return StreamEndToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamStartToken); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_encoding); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_encoding); + __Pyx_GIVEREF(__pyx_v_encoding); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":409 + * encoding = u"utf-16-be" + * return StreamStartToken(start_mark, end_mark, encoding) + * elif token.type == YAML_STREAM_END_TOKEN: # <<<<<<<<<<<<<< + * return StreamEndToken(start_mark, end_mark) + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + */ + case YAML_STREAM_END_TOKEN: + + /* "_yaml.pyx":410 + * return StreamStartToken(start_mark, end_mark, encoding) + * elif token.type == YAML_STREAM_END_TOKEN: + * return StreamEndToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + * return DirectiveToken(u"YAML", + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamEndToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":411 + * elif token.type == YAML_STREAM_END_TOKEN: + * return StreamEndToken(start_mark, end_mark) + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: # <<<<<<<<<<<<<< + * return DirectiveToken(u"YAML", + * (token.data.version_directive.major, + */ + case YAML_VERSION_DIRECTIVE_TOKEN: + + /* "_yaml.pyx":412 + * return StreamEndToken(start_mark, end_mark) + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + * return DirectiveToken(u"YAML", # <<<<<<<<<<<<<< + * (token.data.version_directive.major, + * token.data.version_directive.minor), + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DirectiveToken); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":413 + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + * return DirectiveToken(u"YAML", + * (token.data.version_directive.major, # <<<<<<<<<<<<<< + * token.data.version_directive.minor), + * start_mark, end_mark) + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_token->data.version_directive.major); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":414 + * return DirectiveToken(u"YAML", + * (token.data.version_directive.major, + * token.data.version_directive.minor), # <<<<<<<<<<<<<< + * start_mark, end_mark) + * elif token.type == YAML_TAG_DIRECTIVE_TOKEN: + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_token->data.version_directive.minor); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":413 + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + * return DirectiveToken(u"YAML", + * (token.data.version_directive.major, # <<<<<<<<<<<<<< + * token.data.version_directive.minor), + * start_mark, end_mark) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 413; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_1 = 0; + __pyx_t_4 = 0; + + /* "_yaml.pyx":412 + * return StreamEndToken(start_mark, end_mark) + * elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + * return DirectiveToken(u"YAML", # <<<<<<<<<<<<<< + * (token.data.version_directive.major, + * token.data.version_directive.minor), + */ + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_n_u_YAML); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_n_u_YAML); + __Pyx_GIVEREF(__pyx_n_u_YAML); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 3, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":416 + * token.data.version_directive.minor), + * start_mark, end_mark) + * elif token.type == YAML_TAG_DIRECTIVE_TOKEN: # <<<<<<<<<<<<<< + * handle = PyUnicode_FromString(token.data.tag_directive.handle) + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + */ + case YAML_TAG_DIRECTIVE_TOKEN: + + /* "_yaml.pyx":417 + * start_mark, end_mark) + * elif token.type == YAML_TAG_DIRECTIVE_TOKEN: + * handle = PyUnicode_FromString(token.data.tag_directive.handle) # <<<<<<<<<<<<<< + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + * return DirectiveToken(u"TAG", (handle, prefix), + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_token->data.tag_directive.handle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 417; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_handle = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":418 + * elif token.type == YAML_TAG_DIRECTIVE_TOKEN: + * handle = PyUnicode_FromString(token.data.tag_directive.handle) + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) # <<<<<<<<<<<<<< + * return DirectiveToken(u"TAG", (handle, prefix), + * start_mark, end_mark) + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_token->data.tag_directive.prefix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_prefix = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":419 + * handle = PyUnicode_FromString(token.data.tag_directive.handle) + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + * return DirectiveToken(u"TAG", (handle, prefix), # <<<<<<<<<<<<<< + * start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_START_TOKEN: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DirectiveToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_handle); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_handle); + __Pyx_GIVEREF(__pyx_v_handle); + __Pyx_INCREF(__pyx_v_prefix); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_prefix); + __Pyx_GIVEREF(__pyx_v_prefix); + + /* "_yaml.pyx":420 + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + * return DirectiveToken(u"TAG", (handle, prefix), + * start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_DOCUMENT_START_TOKEN: + * return DocumentStartToken(start_mark, end_mark) + */ + __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_u_TAG); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_u_TAG); + __Pyx_GIVEREF(__pyx_n_u_TAG); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 3, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = 0; + + /* "_yaml.pyx":419 + * handle = PyUnicode_FromString(token.data.tag_directive.handle) + * prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + * return DirectiveToken(u"TAG", (handle, prefix), # <<<<<<<<<<<<<< + * start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_START_TOKEN: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":421 + * return DirectiveToken(u"TAG", (handle, prefix), + * start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_START_TOKEN: # <<<<<<<<<<<<<< + * return DocumentStartToken(start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_END_TOKEN: + */ + case YAML_DOCUMENT_START_TOKEN: + + /* "_yaml.pyx":422 + * start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_START_TOKEN: + * return DocumentStartToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_DOCUMENT_END_TOKEN: + * return DocumentEndToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentStartToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":423 + * elif token.type == YAML_DOCUMENT_START_TOKEN: + * return DocumentStartToken(start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_END_TOKEN: # <<<<<<<<<<<<<< + * return DocumentEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: + */ + case YAML_DOCUMENT_END_TOKEN: + + /* "_yaml.pyx":424 + * return DocumentStartToken(start_mark, end_mark) + * elif token.type == YAML_DOCUMENT_END_TOKEN: + * return DocumentEndToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: + * return BlockSequenceStartToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentEndToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":425 + * elif token.type == YAML_DOCUMENT_END_TOKEN: + * return DocumentEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: # <<<<<<<<<<<<<< + * return BlockSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: + */ + case YAML_BLOCK_SEQUENCE_START_TOKEN: + + /* "_yaml.pyx":426 + * return DocumentEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: + * return BlockSequenceStartToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: + * return BlockMappingStartToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_BlockSequenceStartToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":427 + * elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: + * return BlockSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: # <<<<<<<<<<<<<< + * return BlockMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_END_TOKEN: + */ + case YAML_BLOCK_MAPPING_START_TOKEN: + + /* "_yaml.pyx":428 + * return BlockSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: + * return BlockMappingStartToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_BLOCK_END_TOKEN: + * return BlockEndToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_BlockMappingStartToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":429 + * elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: + * return BlockMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_END_TOKEN: # <<<<<<<<<<<<<< + * return BlockEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: + */ + case YAML_BLOCK_END_TOKEN: + + /* "_yaml.pyx":430 + * return BlockMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_END_TOKEN: + * return BlockEndToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: + * return FlowSequenceStartToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_BlockEndToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":431 + * elif token.type == YAML_BLOCK_END_TOKEN: + * return BlockEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: # <<<<<<<<<<<<<< + * return FlowSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: + */ + case YAML_FLOW_SEQUENCE_START_TOKEN: + + /* "_yaml.pyx":432 + * return BlockEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: + * return FlowSequenceStartToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: + * return FlowSequenceEndToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_FlowSequenceStartToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":433 + * elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: + * return FlowSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: # <<<<<<<<<<<<<< + * return FlowSequenceEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_START_TOKEN: + */ + case YAML_FLOW_SEQUENCE_END_TOKEN: + + /* "_yaml.pyx":434 + * return FlowSequenceStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: + * return FlowSequenceEndToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_FLOW_MAPPING_START_TOKEN: + * return FlowMappingStartToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_FlowSequenceEndToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":435 + * elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: + * return FlowSequenceEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_START_TOKEN: # <<<<<<<<<<<<<< + * return FlowMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_END_TOKEN: + */ + case YAML_FLOW_MAPPING_START_TOKEN: + + /* "_yaml.pyx":436 + * return FlowSequenceEndToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_START_TOKEN: + * return FlowMappingStartToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_FLOW_MAPPING_END_TOKEN: + * return FlowMappingEndToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_FlowMappingStartToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":437 + * elif token.type == YAML_FLOW_MAPPING_START_TOKEN: + * return FlowMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_END_TOKEN: # <<<<<<<<<<<<<< + * return FlowMappingEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_ENTRY_TOKEN: + */ + case YAML_FLOW_MAPPING_END_TOKEN: + + /* "_yaml.pyx":438 + * return FlowMappingStartToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_MAPPING_END_TOKEN: + * return FlowMappingEndToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_BLOCK_ENTRY_TOKEN: + * return BlockEntryToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_FlowMappingEndToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":439 + * elif token.type == YAML_FLOW_MAPPING_END_TOKEN: + * return FlowMappingEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_ENTRY_TOKEN: # <<<<<<<<<<<<<< + * return BlockEntryToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_ENTRY_TOKEN: + */ + case YAML_BLOCK_ENTRY_TOKEN: + + /* "_yaml.pyx":440 + * return FlowMappingEndToken(start_mark, end_mark) + * elif token.type == YAML_BLOCK_ENTRY_TOKEN: + * return BlockEntryToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_FLOW_ENTRY_TOKEN: + * return FlowEntryToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_BlockEntryToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":441 + * elif token.type == YAML_BLOCK_ENTRY_TOKEN: + * return BlockEntryToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_ENTRY_TOKEN: # <<<<<<<<<<<<<< + * return FlowEntryToken(start_mark, end_mark) + * elif token.type == YAML_KEY_TOKEN: + */ + case YAML_FLOW_ENTRY_TOKEN: + + /* "_yaml.pyx":442 + * return BlockEntryToken(start_mark, end_mark) + * elif token.type == YAML_FLOW_ENTRY_TOKEN: + * return FlowEntryToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_KEY_TOKEN: + * return KeyToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_FlowEntryToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":443 + * elif token.type == YAML_FLOW_ENTRY_TOKEN: + * return FlowEntryToken(start_mark, end_mark) + * elif token.type == YAML_KEY_TOKEN: # <<<<<<<<<<<<<< + * return KeyToken(start_mark, end_mark) + * elif token.type == YAML_VALUE_TOKEN: + */ + case YAML_KEY_TOKEN: + + /* "_yaml.pyx":444 + * return FlowEntryToken(start_mark, end_mark) + * elif token.type == YAML_KEY_TOKEN: + * return KeyToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_VALUE_TOKEN: + * return ValueToken(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_KeyToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":445 + * elif token.type == YAML_KEY_TOKEN: + * return KeyToken(start_mark, end_mark) + * elif token.type == YAML_VALUE_TOKEN: # <<<<<<<<<<<<<< + * return ValueToken(start_mark, end_mark) + * elif token.type == YAML_ALIAS_TOKEN: + */ + case YAML_VALUE_TOKEN: + + /* "_yaml.pyx":446 + * return KeyToken(start_mark, end_mark) + * elif token.type == YAML_VALUE_TOKEN: + * return ValueToken(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_ALIAS_TOKEN: + * value = PyUnicode_FromString(token.data.alias.value) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_ValueToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":447 + * elif token.type == YAML_VALUE_TOKEN: + * return ValueToken(start_mark, end_mark) + * elif token.type == YAML_ALIAS_TOKEN: # <<<<<<<<<<<<<< + * value = PyUnicode_FromString(token.data.alias.value) + * return AliasToken(value, start_mark, end_mark) + */ + case YAML_ALIAS_TOKEN: + + /* "_yaml.pyx":448 + * return ValueToken(start_mark, end_mark) + * elif token.type == YAML_ALIAS_TOKEN: + * value = PyUnicode_FromString(token.data.alias.value) # <<<<<<<<<<<<<< + * return AliasToken(value, start_mark, end_mark) + * elif token.type == YAML_ANCHOR_TOKEN: + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_token->data.alias.value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":449 + * elif token.type == YAML_ALIAS_TOKEN: + * value = PyUnicode_FromString(token.data.alias.value) + * return AliasToken(value, start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_ANCHOR_TOKEN: + * value = PyUnicode_FromString(token.data.anchor.value) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_AliasToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":450 + * value = PyUnicode_FromString(token.data.alias.value) + * return AliasToken(value, start_mark, end_mark) + * elif token.type == YAML_ANCHOR_TOKEN: # <<<<<<<<<<<<<< + * value = PyUnicode_FromString(token.data.anchor.value) + * return AnchorToken(value, start_mark, end_mark) + */ + case YAML_ANCHOR_TOKEN: + + /* "_yaml.pyx":451 + * return AliasToken(value, start_mark, end_mark) + * elif token.type == YAML_ANCHOR_TOKEN: + * value = PyUnicode_FromString(token.data.anchor.value) # <<<<<<<<<<<<<< + * return AnchorToken(value, start_mark, end_mark) + * elif token.type == YAML_TAG_TOKEN: + */ + __pyx_t_4 = PyUnicode_FromString(__pyx_v_token->data.anchor.value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_value = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_yaml.pyx":452 + * elif token.type == YAML_ANCHOR_TOKEN: + * value = PyUnicode_FromString(token.data.anchor.value) + * return AnchorToken(value, start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_TAG_TOKEN: + * handle = PyUnicode_FromString(token.data.tag.handle) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_AnchorToken); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 2, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":453 + * value = PyUnicode_FromString(token.data.anchor.value) + * return AnchorToken(value, start_mark, end_mark) + * elif token.type == YAML_TAG_TOKEN: # <<<<<<<<<<<<<< + * handle = PyUnicode_FromString(token.data.tag.handle) + * suffix = PyUnicode_FromString(token.data.tag.suffix) + */ + case YAML_TAG_TOKEN: + + /* "_yaml.pyx":454 + * return AnchorToken(value, start_mark, end_mark) + * elif token.type == YAML_TAG_TOKEN: + * handle = PyUnicode_FromString(token.data.tag.handle) # <<<<<<<<<<<<<< + * suffix = PyUnicode_FromString(token.data.tag.suffix) + * if not handle: + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_token->data.tag.handle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_handle = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":455 + * elif token.type == YAML_TAG_TOKEN: + * handle = PyUnicode_FromString(token.data.tag.handle) + * suffix = PyUnicode_FromString(token.data.tag.suffix) # <<<<<<<<<<<<<< + * if not handle: + * handle = None + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_token->data.tag.suffix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_suffix = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":456 + * handle = PyUnicode_FromString(token.data.tag.handle) + * suffix = PyUnicode_FromString(token.data.tag.suffix) + * if not handle: # <<<<<<<<<<<<<< + * handle = None + * return TagToken((handle, suffix), start_mark, end_mark) + */ + __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_handle); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_6 = ((!__pyx_t_5) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":457 + * suffix = PyUnicode_FromString(token.data.tag.suffix) + * if not handle: + * handle = None # <<<<<<<<<<<<<< + * return TagToken((handle, suffix), start_mark, end_mark) + * elif token.type == YAML_SCALAR_TOKEN: + */ + __Pyx_INCREF(Py_None); + __Pyx_DECREF_SET(__pyx_v_handle, Py_None); + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":458 + * if not handle: + * handle = None + * return TagToken((handle, suffix), start_mark, end_mark) # <<<<<<<<<<<<<< + * elif token.type == YAML_SCALAR_TOKEN: + * value = PyUnicode_DecodeUTF8(token.data.scalar.value, + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_TagToken); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_handle); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_handle); + __Pyx_GIVEREF(__pyx_v_handle); + __Pyx_INCREF(__pyx_v_suffix); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_suffix); + __Pyx_GIVEREF(__pyx_v_suffix); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 2, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":459 + * handle = None + * return TagToken((handle, suffix), start_mark, end_mark) + * elif token.type == YAML_SCALAR_TOKEN: # <<<<<<<<<<<<<< + * value = PyUnicode_DecodeUTF8(token.data.scalar.value, + * token.data.scalar.length, 'strict') + */ + case YAML_SCALAR_TOKEN: + + /* "_yaml.pyx":460 + * return TagToken((handle, suffix), start_mark, end_mark) + * elif token.type == YAML_SCALAR_TOKEN: + * value = PyUnicode_DecodeUTF8(token.data.scalar.value, # <<<<<<<<<<<<<< + * token.data.scalar.length, 'strict') + * plain = False + */ + __pyx_t_2 = PyUnicode_DecodeUTF8(__pyx_v_token->data.scalar.value, __pyx_v_token->data.scalar.length, __pyx_k_strict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_value = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":462 + * value = PyUnicode_DecodeUTF8(token.data.scalar.value, + * token.data.scalar.length, 'strict') + * plain = False # <<<<<<<<<<<<<< + * style = None + * if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + */ + __pyx_v_plain = 0; + + /* "_yaml.pyx":463 + * token.data.scalar.length, 'strict') + * plain = False + * style = None # <<<<<<<<<<<<<< + * if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * plain = True + */ + __Pyx_INCREF(Py_None); + __pyx_v_style = Py_None; + + /* "_yaml.pyx":464 + * plain = False + * style = None + * if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: # <<<<<<<<<<<<<< + * plain = True + * style = u'' + */ + __pyx_t_6 = ((__pyx_v_token->data.scalar.style == YAML_PLAIN_SCALAR_STYLE) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":465 + * style = None + * if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * plain = True # <<<<<<<<<<<<<< + * style = u'' + * elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + */ + __pyx_v_plain = 1; + + /* "_yaml.pyx":466 + * if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * plain = True + * style = u'' # <<<<<<<<<<<<<< + * elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + */ + __Pyx_INCREF(__pyx_kp_u__6); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__6); + goto __pyx_L6; + } + + /* "_yaml.pyx":467 + * plain = True + * style = u'' + * elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'\'' + * elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + */ + __pyx_t_6 = ((__pyx_v_token->data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":468 + * style = u'' + * elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' # <<<<<<<<<<<<<< + * elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + */ + __Pyx_INCREF(__pyx_kp_u__7); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__7); + goto __pyx_L6; + } + + /* "_yaml.pyx":469 + * elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + * elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'"' + * elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + */ + __pyx_t_6 = ((__pyx_v_token->data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":470 + * style = u'\'' + * elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' # <<<<<<<<<<<<<< + * elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + */ + __Pyx_INCREF(__pyx_kp_u__8); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__8); + goto __pyx_L6; + } + + /* "_yaml.pyx":471 + * elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + * elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'|' + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + */ + __pyx_t_6 = ((__pyx_v_token->data.scalar.style == YAML_LITERAL_SCALAR_STYLE) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":472 + * style = u'"' + * elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' # <<<<<<<<<<<<<< + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + */ + __Pyx_INCREF(__pyx_kp_u__9); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__9); + goto __pyx_L6; + } + + /* "_yaml.pyx":473 + * elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'>' + * return ScalarToken(value, plain, + */ + __pyx_t_6 = ((__pyx_v_token->data.scalar.style == YAML_FOLDED_SCALAR_STYLE) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":474 + * style = u'|' + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' # <<<<<<<<<<<<<< + * return ScalarToken(value, plain, + * start_mark, end_mark, style) + */ + __Pyx_INCREF(__pyx_kp_u__10); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__10); + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":475 + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + * return ScalarToken(value, plain, # <<<<<<<<<<<<<< + * start_mark, end_mark, style) + * else: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarToken); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_plain); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":476 + * style = u'>' + * return ScalarToken(value, plain, + * start_mark, end_mark, style) # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_3 = PyTuple_New(5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_style); + PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_v_style); + __Pyx_GIVEREF(__pyx_v_style); + __pyx_t_4 = 0; + + /* "_yaml.pyx":475 + * elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + * return ScalarToken(value, plain, # <<<<<<<<<<<<<< + * start_mark, end_mark, style) + * else: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + default: + + /* "_yaml.pyx":478 + * start_mark, end_mark, style) + * else: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("unknown token type") + * else: + */ + __pyx_t_6 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":479 + * else: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("unknown token type") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown token type") + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":481 + * raise ValueError("unknown token type") + * else: + * raise ValueError(u"unknown token type") # <<<<<<<<<<<<<< + * + * def get_token(self): + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + + /* "_yaml.pyx":386 + * return token_object + * + * cdef object _token_to_object(self, yaml_token_t *token): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * token.start_mark.index, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.CParser._token_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_start_mark); + __Pyx_XDECREF((PyObject *)__pyx_v_end_mark); + __Pyx_XDECREF(__pyx_v_encoding); + __Pyx_XDECREF(__pyx_v_handle); + __Pyx_XDECREF(__pyx_v_prefix); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_suffix); + __Pyx_XDECREF(__pyx_v_style); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":483 + * raise ValueError(u"unknown token type") + * + * def get_token(self): # <<<<<<<<<<<<<< + * if self.current_token is not None: + * value = self.current_token + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_9get_token(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_9get_token(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_token (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_8get_token(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_8get_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_token", 0); + + /* "_yaml.pyx":484 + * + * def get_token(self): + * if self.current_token is not None: # <<<<<<<<<<<<<< + * value = self.current_token + * self.current_token = None + */ + __pyx_t_1 = (__pyx_v_self->current_token != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":485 + * def get_token(self): + * if self.current_token is not None: + * value = self.current_token # <<<<<<<<<<<<<< + * self.current_token = None + * else: + */ + __pyx_t_3 = __pyx_v_self->current_token; + __Pyx_INCREF(__pyx_t_3); + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":486 + * if self.current_token is not None: + * value = self.current_token + * self.current_token = None # <<<<<<<<<<<<<< + * else: + * value = self._scan() + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->current_token); + __Pyx_DECREF(__pyx_v_self->current_token); + __pyx_v_self->current_token = Py_None; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":488 + * self.current_token = None + * else: + * value = self._scan() # <<<<<<<<<<<<<< + * return value + * + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_scan(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "_yaml.pyx":489 + * else: + * value = self._scan() + * return value # <<<<<<<<<<<<<< + * + * def peek_token(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_value); + __pyx_r = __pyx_v_value; + goto __pyx_L0; + + /* "_yaml.pyx":483 + * raise ValueError(u"unknown token type") + * + * def get_token(self): # <<<<<<<<<<<<<< + * if self.current_token is not None: + * value = self.current_token + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.get_token", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":491 + * return value + * + * def peek_token(self): # <<<<<<<<<<<<<< + * if self.current_token is None: + * self.current_token = self._scan() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_11peek_token(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_11peek_token(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("peek_token (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_10peek_token(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_10peek_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("peek_token", 0); + + /* "_yaml.pyx":492 + * + * def peek_token(self): + * if self.current_token is None: # <<<<<<<<<<<<<< + * self.current_token = self._scan() + * return self.current_token + */ + __pyx_t_1 = (__pyx_v_self->current_token == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":493 + * def peek_token(self): + * if self.current_token is None: + * self.current_token = self._scan() # <<<<<<<<<<<<<< + * return self.current_token + * + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_scan(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->current_token); + __Pyx_DECREF(__pyx_v_self->current_token); + __pyx_v_self->current_token = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":494 + * if self.current_token is None: + * self.current_token = self._scan() + * return self.current_token # <<<<<<<<<<<<<< + * + * def check_token(self, *choices): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->current_token); + __pyx_r = __pyx_v_self->current_token; + goto __pyx_L0; + + /* "_yaml.pyx":491 + * return value + * + * def peek_token(self): # <<<<<<<<<<<<<< + * if self.current_token is None: + * self.current_token = self._scan() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.peek_token", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":496 + * return self.current_token + * + * def check_token(self, *choices): # <<<<<<<<<<<<<< + * if self.current_token is None: + * self.current_token = self._scan() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_13check_token(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_13check_token(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_choices = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("check_token (wrapper)", 0); + if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "check_token", 0))) return NULL; + __Pyx_INCREF(__pyx_args); + __pyx_v_choices = __pyx_args; + __pyx_r = __pyx_pf_5_yaml_7CParser_12check_token(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self), __pyx_v_choices); + + /* function exit code */ + __Pyx_XDECREF(__pyx_v_choices); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_12check_token(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_choices) { + PyObject *__pyx_v_token_class = NULL; + PyObject *__pyx_v_choice = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_token", 0); + + /* "_yaml.pyx":497 + * + * def check_token(self, *choices): + * if self.current_token is None: # <<<<<<<<<<<<<< + * self.current_token = self._scan() + * if self.current_token is None: + */ + __pyx_t_1 = (__pyx_v_self->current_token == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":498 + * def check_token(self, *choices): + * if self.current_token is None: + * self.current_token = self._scan() # <<<<<<<<<<<<<< + * if self.current_token is None: + * return False + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_scan(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->current_token); + __Pyx_DECREF(__pyx_v_self->current_token); + __pyx_v_self->current_token = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":499 + * if self.current_token is None: + * self.current_token = self._scan() + * if self.current_token is None: # <<<<<<<<<<<<<< + * return False + * if not choices: + */ + __pyx_t_2 = (__pyx_v_self->current_token == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":500 + * self.current_token = self._scan() + * if self.current_token is None: + * return False # <<<<<<<<<<<<<< + * if not choices: + * return True + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + } + + /* "_yaml.pyx":501 + * if self.current_token is None: + * return False + * if not choices: # <<<<<<<<<<<<<< + * return True + * token_class = self.current_token.__class__ + */ + __pyx_t_1 = (__pyx_v_choices != Py_None) && (PyTuple_GET_SIZE(__pyx_v_choices) != 0); + __pyx_t_2 = ((!__pyx_t_1) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":502 + * return False + * if not choices: + * return True # <<<<<<<<<<<<<< + * token_class = self.current_token.__class__ + * for choice in choices: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + } + + /* "_yaml.pyx":503 + * if not choices: + * return True + * token_class = self.current_token.__class__ # <<<<<<<<<<<<<< + * for choice in choices: + * if token_class is choice: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->current_token, __pyx_n_s_class); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_token_class = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":504 + * return True + * token_class = self.current_token.__class__ + * for choice in choices: # <<<<<<<<<<<<<< + * if token_class is choice: + * return True + */ + __pyx_t_3 = __pyx_v_choices; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0; + for (;;) { + if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_5); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + __Pyx_XDECREF_SET(__pyx_v_choice, __pyx_t_5); + __pyx_t_5 = 0; + + /* "_yaml.pyx":505 + * token_class = self.current_token.__class__ + * for choice in choices: + * if token_class is choice: # <<<<<<<<<<<<<< + * return True + * return False + */ + __pyx_t_2 = (__pyx_v_token_class == __pyx_v_choice); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":506 + * for choice in choices: + * if token_class is choice: + * return True # <<<<<<<<<<<<<< + * return False + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":507 + * if token_class is choice: + * return True + * return False # <<<<<<<<<<<<<< + * + * def raw_parse(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_yaml.pyx":496 + * return self.current_token + * + * def check_token(self, *choices): # <<<<<<<<<<<<<< + * if self.current_token is None: + * self.current_token = self._scan() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_yaml.CParser.check_token", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_token_class); + __Pyx_XDECREF(__pyx_v_choice); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":509 + * return False + * + * def raw_parse(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef int done + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_15raw_parse(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_15raw_parse(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("raw_parse (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_14raw_parse(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_14raw_parse(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + yaml_event_t __pyx_v_event; + int __pyx_v_done; + int __pyx_v_count; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("raw_parse", 0); + + /* "_yaml.pyx":513 + * cdef int done + * cdef int count + * count = 0 # <<<<<<<<<<<<<< + * done = 0 + * while done == 0: + */ + __pyx_v_count = 0; + + /* "_yaml.pyx":514 + * cdef int count + * count = 0 + * done = 0 # <<<<<<<<<<<<<< + * while done == 0: + * if yaml_parser_parse(&self.parser, &event) == 0: + */ + __pyx_v_done = 0; + + /* "_yaml.pyx":515 + * count = 0 + * done = 0 + * while done == 0: # <<<<<<<<<<<<<< + * if yaml_parser_parse(&self.parser, &event) == 0: + * error = self._parser_error() + */ + while (1) { + __pyx_t_1 = ((__pyx_v_done == 0) != 0); + if (!__pyx_t_1) break; + + /* "_yaml.pyx":516 + * done = 0 + * while done == 0: + * if yaml_parser_parse(&self.parser, &event) == 0: # <<<<<<<<<<<<<< + * error = self._parser_error() + * raise error + */ + __pyx_t_2 = yaml_parser_parse((&__pyx_v_self->parser), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_2 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":517 + * while done == 0: + * if yaml_parser_parse(&self.parser, &event) == 0: + * error = self._parser_error() # <<<<<<<<<<<<<< + * raise error + * if event.type == YAML_NO_EVENT: + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parser_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":518 + * if yaml_parser_parse(&self.parser, &event) == 0: + * error = self._parser_error() + * raise error # <<<<<<<<<<<<<< + * if event.type == YAML_NO_EVENT: + * done = 1 + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":519 + * error = self._parser_error() + * raise error + * if event.type == YAML_NO_EVENT: # <<<<<<<<<<<<<< + * done = 1 + * else: + */ + __pyx_t_1 = ((__pyx_v_event.type == YAML_NO_EVENT) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":520 + * raise error + * if event.type == YAML_NO_EVENT: + * done = 1 # <<<<<<<<<<<<<< + * else: + * count = count+1 + */ + __pyx_v_done = 1; + goto __pyx_L6; + } + /*else*/ { + + /* "_yaml.pyx":522 + * done = 1 + * else: + * count = count+1 # <<<<<<<<<<<<<< + * yaml_event_delete(&event) + * return count + */ + __pyx_v_count = (__pyx_v_count + 1); + } + __pyx_L6:; + + /* "_yaml.pyx":523 + * else: + * count = count+1 + * yaml_event_delete(&event) # <<<<<<<<<<<<<< + * return count + * + */ + yaml_event_delete((&__pyx_v_event)); + } + + /* "_yaml.pyx":524 + * count = count+1 + * yaml_event_delete(&event) + * return count # <<<<<<<<<<<<<< + * + * cdef object _parse(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "_yaml.pyx":509 + * return False + * + * def raw_parse(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef int done + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.raw_parse", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":526 + * return count + * + * cdef object _parse(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * if yaml_parser_parse(&self.parser, &event) == 0: + */ + +static PyObject *__pyx_f_5_yaml_7CParser__parse(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + yaml_event_t __pyx_v_event; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_v_event_object = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_parse", 0); + + /* "_yaml.pyx":528 + * cdef object _parse(self): + * cdef yaml_event_t event + * if yaml_parser_parse(&self.parser, &event) == 0: # <<<<<<<<<<<<<< + * error = self._parser_error() + * raise error + */ + __pyx_t_1 = yaml_parser_parse((&__pyx_v_self->parser), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((__pyx_t_1 == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":529 + * cdef yaml_event_t event + * if yaml_parser_parse(&self.parser, &event) == 0: + * error = self._parser_error() # <<<<<<<<<<<<<< + * raise error + * event_object = self._event_to_object(&event) + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parser_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 529; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":530 + * if yaml_parser_parse(&self.parser, &event) == 0: + * error = self._parser_error() + * raise error # <<<<<<<<<<<<<< + * event_object = self._event_to_object(&event) + * yaml_event_delete(&event) + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 530; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":531 + * error = self._parser_error() + * raise error + * event_object = self._event_to_object(&event) # <<<<<<<<<<<<<< + * yaml_event_delete(&event) + * return event_object + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_event_to_object(__pyx_v_self, (&__pyx_v_event)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 531; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_event_object = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":532 + * raise error + * event_object = self._event_to_object(&event) + * yaml_event_delete(&event) # <<<<<<<<<<<<<< + * return event_object + * + */ + yaml_event_delete((&__pyx_v_event)); + + /* "_yaml.pyx":533 + * event_object = self._event_to_object(&event) + * yaml_event_delete(&event) + * return event_object # <<<<<<<<<<<<<< + * + * cdef object _event_to_object(self, yaml_event_t *event): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_event_object); + __pyx_r = __pyx_v_event_object; + goto __pyx_L0; + + /* "_yaml.pyx":526 + * return count + * + * cdef object _parse(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * if yaml_parser_parse(&self.parser, &event) == 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser._parse", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XDECREF(__pyx_v_event_object); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":535 + * return event_object + * + * cdef object _event_to_object(self, yaml_event_t *event): # <<<<<<<<<<<<<< + * cdef yaml_tag_directive_t *tag_directive + * start_mark = Mark(self.stream_name, + */ + +static PyObject *__pyx_f_5_yaml_7CParser__event_to_object(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, yaml_event_t *__pyx_v_event) { + yaml_tag_directive_t *__pyx_v_tag_directive; + struct __pyx_obj_5_yaml_Mark *__pyx_v_start_mark = NULL; + struct __pyx_obj_5_yaml_Mark *__pyx_v_end_mark = NULL; + PyObject *__pyx_v_encoding = NULL; + int __pyx_v_explicit; + PyObject *__pyx_v_version = NULL; + PyObject *__pyx_v_tags = NULL; + PyObject *__pyx_v_handle = NULL; + PyObject *__pyx_v_prefix = NULL; + PyObject *__pyx_v_anchor = NULL; + PyObject *__pyx_v_tag = NULL; + PyObject *__pyx_v_value = NULL; + int __pyx_v_plain_implicit; + int __pyx_v_quoted_implicit; + PyObject *__pyx_v_style = NULL; + int __pyx_v_implicit; + PyObject *__pyx_v_flow_style = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + yaml_tag_directive_t *__pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_event_to_object", 0); + + /* "_yaml.pyx":538 + * cdef yaml_tag_directive_t *tag_directive + * start_mark = Mark(self.stream_name, + * event.start_mark.index, # <<<<<<<<<<<<<< + * event.start_mark.line, + * event.start_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_event->start_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":539 + * start_mark = Mark(self.stream_name, + * event.start_mark.index, + * event.start_mark.line, # <<<<<<<<<<<<<< + * event.start_mark.column, + * None, None) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_event->start_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":540 + * event.start_mark.index, + * event.start_mark.line, + * event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * end_mark = Mark(self.stream_name, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_event->start_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 540; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":537 + * cdef object _event_to_object(self, yaml_event_t *event): + * cdef yaml_tag_directive_t *tag_directive + * start_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * event.start_mark.index, + * event.start_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_start_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":543 + * None, None) + * end_mark = Mark(self.stream_name, + * event.end_mark.index, # <<<<<<<<<<<<<< + * event.end_mark.line, + * event.end_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_event->end_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":544 + * end_mark = Mark(self.stream_name, + * event.end_mark.index, + * event.end_mark.line, # <<<<<<<<<<<<<< + * event.end_mark.column, + * None, None) + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_event->end_mark.line); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 544; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":545 + * event.end_mark.index, + * event.end_mark.line, + * event.end_mark.column, # <<<<<<<<<<<<<< + * None, None) + * if event.type == YAML_NO_EVENT: + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_event->end_mark.column); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":542 + * event.start_mark.column, + * None, None) + * end_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * event.end_mark.index, + * event.end_mark.line, + */ + __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_end_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":653 + * elif event.type == YAML_SEQUENCE_END_EVENT: + * return SequenceEndEvent(start_mark, end_mark) + * elif event.type == YAML_MAPPING_END_EVENT: # <<<<<<<<<<<<<< + * return MappingEndEvent(start_mark, end_mark) + * else: + */ + switch (__pyx_v_event->type) { + + /* "_yaml.pyx":547 + * event.end_mark.column, + * None, None) + * if event.type == YAML_NO_EVENT: # <<<<<<<<<<<<<< + * return None + * elif event.type == YAML_STREAM_START_EVENT: + */ + case YAML_NO_EVENT: + + /* "_yaml.pyx":548 + * None, None) + * if event.type == YAML_NO_EVENT: + * return None # <<<<<<<<<<<<<< + * elif event.type == YAML_STREAM_START_EVENT: + * encoding = None + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + break; + + /* "_yaml.pyx":549 + * if event.type == YAML_NO_EVENT: + * return None + * elif event.type == YAML_STREAM_START_EVENT: # <<<<<<<<<<<<<< + * encoding = None + * if event.data.stream_start.encoding == YAML_UTF8_ENCODING: + */ + case YAML_STREAM_START_EVENT: + + /* "_yaml.pyx":550 + * return None + * elif event.type == YAML_STREAM_START_EVENT: + * encoding = None # <<<<<<<<<<<<<< + * if event.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: + */ + __Pyx_INCREF(Py_None); + __pyx_v_encoding = Py_None; + + /* "_yaml.pyx":551 + * elif event.type == YAML_STREAM_START_EVENT: + * encoding = None + * if event.data.stream_start.encoding == YAML_UTF8_ENCODING: # <<<<<<<<<<<<<< + * if self.unicode_source == 0: + * encoding = u"utf-8" + */ + __pyx_t_5 = ((__pyx_v_event->data.stream_start.encoding == YAML_UTF8_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":552 + * encoding = None + * if event.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: # <<<<<<<<<<<<<< + * encoding = u"utf-8" + * elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + */ + __pyx_t_5 = ((__pyx_v_self->unicode_source == 0) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":553 + * if event.data.stream_start.encoding == YAML_UTF8_ENCODING: + * if self.unicode_source == 0: + * encoding = u"utf-8" # <<<<<<<<<<<<<< + * elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" + */ + __Pyx_INCREF(__pyx_kp_u_utf_8); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_8); + goto __pyx_L4; + } + __pyx_L4:; + goto __pyx_L3; + } + + /* "_yaml.pyx":554 + * if self.unicode_source == 0: + * encoding = u"utf-8" + * elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: # <<<<<<<<<<<<<< + * encoding = u"utf-16-le" + * elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + */ + __pyx_t_5 = ((__pyx_v_event->data.stream_start.encoding == YAML_UTF16LE_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":555 + * encoding = u"utf-8" + * elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" # <<<<<<<<<<<<<< + * elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" + */ + __Pyx_INCREF(__pyx_kp_u_utf_16_le); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_16_le); + goto __pyx_L3; + } + + /* "_yaml.pyx":556 + * elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + * encoding = u"utf-16-le" + * elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: # <<<<<<<<<<<<<< + * encoding = u"utf-16-be" + * return StreamStartEvent(start_mark, end_mark, encoding) + */ + __pyx_t_5 = ((__pyx_v_event->data.stream_start.encoding == YAML_UTF16BE_ENCODING) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":557 + * encoding = u"utf-16-le" + * elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" # <<<<<<<<<<<<<< + * return StreamStartEvent(start_mark, end_mark, encoding) + * elif event.type == YAML_STREAM_END_EVENT: + */ + __Pyx_INCREF(__pyx_kp_u_utf_16_be); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_kp_u_utf_16_be); + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":558 + * elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + * encoding = u"utf-16-be" + * return StreamStartEvent(start_mark, end_mark, encoding) # <<<<<<<<<<<<<< + * elif event.type == YAML_STREAM_END_EVENT: + * return StreamEndEvent(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamStartEvent); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_encoding); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_encoding); + __Pyx_GIVEREF(__pyx_v_encoding); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 558; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":559 + * encoding = u"utf-16-be" + * return StreamStartEvent(start_mark, end_mark, encoding) + * elif event.type == YAML_STREAM_END_EVENT: # <<<<<<<<<<<<<< + * return StreamEndEvent(start_mark, end_mark) + * elif event.type == YAML_DOCUMENT_START_EVENT: + */ + case YAML_STREAM_END_EVENT: + + /* "_yaml.pyx":560 + * return StreamStartEvent(start_mark, end_mark, encoding) + * elif event.type == YAML_STREAM_END_EVENT: + * return StreamEndEvent(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif event.type == YAML_DOCUMENT_START_EVENT: + * explicit = False + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamEndEvent); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 560; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":561 + * elif event.type == YAML_STREAM_END_EVENT: + * return StreamEndEvent(start_mark, end_mark) + * elif event.type == YAML_DOCUMENT_START_EVENT: # <<<<<<<<<<<<<< + * explicit = False + * if event.data.document_start.implicit == 0: + */ + case YAML_DOCUMENT_START_EVENT: + + /* "_yaml.pyx":562 + * return StreamEndEvent(start_mark, end_mark) + * elif event.type == YAML_DOCUMENT_START_EVENT: + * explicit = False # <<<<<<<<<<<<<< + * if event.data.document_start.implicit == 0: + * explicit = True + */ + __pyx_v_explicit = 0; + + /* "_yaml.pyx":563 + * elif event.type == YAML_DOCUMENT_START_EVENT: + * explicit = False + * if event.data.document_start.implicit == 0: # <<<<<<<<<<<<<< + * explicit = True + * version = None + */ + __pyx_t_5 = ((__pyx_v_event->data.document_start.implicit == 0) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":564 + * explicit = False + * if event.data.document_start.implicit == 0: + * explicit = True # <<<<<<<<<<<<<< + * version = None + * if event.data.document_start.version_directive != NULL: + */ + __pyx_v_explicit = 1; + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":565 + * if event.data.document_start.implicit == 0: + * explicit = True + * version = None # <<<<<<<<<<<<<< + * if event.data.document_start.version_directive != NULL: + * version = (event.data.document_start.version_directive.major, + */ + __Pyx_INCREF(Py_None); + __pyx_v_version = Py_None; + + /* "_yaml.pyx":566 + * explicit = True + * version = None + * if event.data.document_start.version_directive != NULL: # <<<<<<<<<<<<<< + * version = (event.data.document_start.version_directive.major, + * event.data.document_start.version_directive.minor) + */ + __pyx_t_5 = ((__pyx_v_event->data.document_start.version_directive != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":567 + * version = None + * if event.data.document_start.version_directive != NULL: + * version = (event.data.document_start.version_directive.major, # <<<<<<<<<<<<<< + * event.data.document_start.version_directive.minor) + * tags = None + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_event->data.document_start.version_directive->major); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":568 + * if event.data.document_start.version_directive != NULL: + * version = (event.data.document_start.version_directive.major, + * event.data.document_start.version_directive.minor) # <<<<<<<<<<<<<< + * tags = None + * if event.data.document_start.tag_directives.start != NULL: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_event->data.document_start.version_directive->minor); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":567 + * version = None + * if event.data.document_start.version_directive != NULL: + * version = (event.data.document_start.version_directive.major, # <<<<<<<<<<<<<< + * event.data.document_start.version_directive.minor) + * tags = None + */ + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 567; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_2 = 0; + __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_version, __pyx_t_4); + __pyx_t_4 = 0; + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":569 + * version = (event.data.document_start.version_directive.major, + * event.data.document_start.version_directive.minor) + * tags = None # <<<<<<<<<<<<<< + * if event.data.document_start.tag_directives.start != NULL: + * tags = {} + */ + __Pyx_INCREF(Py_None); + __pyx_v_tags = Py_None; + + /* "_yaml.pyx":570 + * event.data.document_start.version_directive.minor) + * tags = None + * if event.data.document_start.tag_directives.start != NULL: # <<<<<<<<<<<<<< + * tags = {} + * tag_directive = event.data.document_start.tag_directives.start + */ + __pyx_t_5 = ((__pyx_v_event->data.document_start.tag_directives.start != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":571 + * tags = None + * if event.data.document_start.tag_directives.start != NULL: + * tags = {} # <<<<<<<<<<<<<< + * tag_directive = event.data.document_start.tag_directives.start + * while tag_directive != event.data.document_start.tag_directives.end: + */ + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 571; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_tags, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_yaml.pyx":572 + * if event.data.document_start.tag_directives.start != NULL: + * tags = {} + * tag_directive = event.data.document_start.tag_directives.start # <<<<<<<<<<<<<< + * while tag_directive != event.data.document_start.tag_directives.end: + * handle = PyUnicode_FromString(tag_directive.handle) + */ + __pyx_t_6 = __pyx_v_event->data.document_start.tag_directives.start; + __pyx_v_tag_directive = __pyx_t_6; + + /* "_yaml.pyx":573 + * tags = {} + * tag_directive = event.data.document_start.tag_directives.start + * while tag_directive != event.data.document_start.tag_directives.end: # <<<<<<<<<<<<<< + * handle = PyUnicode_FromString(tag_directive.handle) + * prefix = PyUnicode_FromString(tag_directive.prefix) + */ + while (1) { + __pyx_t_5 = ((__pyx_v_tag_directive != __pyx_v_event->data.document_start.tag_directives.end) != 0); + if (!__pyx_t_5) break; + + /* "_yaml.pyx":574 + * tag_directive = event.data.document_start.tag_directives.start + * while tag_directive != event.data.document_start.tag_directives.end: + * handle = PyUnicode_FromString(tag_directive.handle) # <<<<<<<<<<<<<< + * prefix = PyUnicode_FromString(tag_directive.prefix) + * tags[handle] = prefix + */ + __pyx_t_4 = PyUnicode_FromString(__pyx_v_tag_directive->handle); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 574; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_handle, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_yaml.pyx":575 + * while tag_directive != event.data.document_start.tag_directives.end: + * handle = PyUnicode_FromString(tag_directive.handle) + * prefix = PyUnicode_FromString(tag_directive.prefix) # <<<<<<<<<<<<<< + * tags[handle] = prefix + * tag_directive = tag_directive+1 + */ + __pyx_t_4 = PyUnicode_FromString(__pyx_v_tag_directive->prefix); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 575; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_prefix, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_yaml.pyx":576 + * handle = PyUnicode_FromString(tag_directive.handle) + * prefix = PyUnicode_FromString(tag_directive.prefix) + * tags[handle] = prefix # <<<<<<<<<<<<<< + * tag_directive = tag_directive+1 + * return DocumentStartEvent(start_mark, end_mark, + */ + if (unlikely(PyObject_SetItem(__pyx_v_tags, __pyx_v_handle, __pyx_v_prefix) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":577 + * prefix = PyUnicode_FromString(tag_directive.prefix) + * tags[handle] = prefix + * tag_directive = tag_directive+1 # <<<<<<<<<<<<<< + * return DocumentStartEvent(start_mark, end_mark, + * explicit, version, tags) + */ + __pyx_v_tag_directive = (__pyx_v_tag_directive + 1); + } + goto __pyx_L7; + } + __pyx_L7:; + + /* "_yaml.pyx":578 + * tags[handle] = prefix + * tag_directive = tag_directive+1 + * return DocumentStartEvent(start_mark, end_mark, # <<<<<<<<<<<<<< + * explicit, version, tags) + * elif event.type == YAML_DOCUMENT_END_EVENT: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentStartEvent); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":579 + * tag_directive = tag_directive+1 + * return DocumentStartEvent(start_mark, end_mark, + * explicit, version, tags) # <<<<<<<<<<<<<< + * elif event.type == YAML_DOCUMENT_END_EVENT: + * explicit = False + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_explicit); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 579; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":578 + * tags[handle] = prefix + * tag_directive = tag_directive+1 + * return DocumentStartEvent(start_mark, end_mark, # <<<<<<<<<<<<<< + * explicit, version, tags) + * elif event.type == YAML_DOCUMENT_END_EVENT: + */ + __pyx_t_2 = PyTuple_New(5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_version); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_INCREF(__pyx_v_tags); + PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_tags); + __Pyx_GIVEREF(__pyx_v_tags); + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":580 + * return DocumentStartEvent(start_mark, end_mark, + * explicit, version, tags) + * elif event.type == YAML_DOCUMENT_END_EVENT: # <<<<<<<<<<<<<< + * explicit = False + * if event.data.document_end.implicit == 0: + */ + case YAML_DOCUMENT_END_EVENT: + + /* "_yaml.pyx":581 + * explicit, version, tags) + * elif event.type == YAML_DOCUMENT_END_EVENT: + * explicit = False # <<<<<<<<<<<<<< + * if event.data.document_end.implicit == 0: + * explicit = True + */ + __pyx_v_explicit = 0; + + /* "_yaml.pyx":582 + * elif event.type == YAML_DOCUMENT_END_EVENT: + * explicit = False + * if event.data.document_end.implicit == 0: # <<<<<<<<<<<<<< + * explicit = True + * return DocumentEndEvent(start_mark, end_mark, explicit) + */ + __pyx_t_5 = ((__pyx_v_event->data.document_end.implicit == 0) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":583 + * explicit = False + * if event.data.document_end.implicit == 0: + * explicit = True # <<<<<<<<<<<<<< + * return DocumentEndEvent(start_mark, end_mark, explicit) + * elif event.type == YAML_ALIAS_EVENT: + */ + __pyx_v_explicit = 1; + goto __pyx_L10; + } + __pyx_L10:; + + /* "_yaml.pyx":584 + * if event.data.document_end.implicit == 0: + * explicit = True + * return DocumentEndEvent(start_mark, end_mark, explicit) # <<<<<<<<<<<<<< + * elif event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(event.data.alias.anchor) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_explicit); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":585 + * explicit = True + * return DocumentEndEvent(start_mark, end_mark, explicit) + * elif event.type == YAML_ALIAS_EVENT: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(event.data.alias.anchor) + * return AliasEvent(anchor, start_mark, end_mark) + */ + case YAML_ALIAS_EVENT: + + /* "_yaml.pyx":586 + * return DocumentEndEvent(start_mark, end_mark, explicit) + * elif event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(event.data.alias.anchor) # <<<<<<<<<<<<<< + * return AliasEvent(anchor, start_mark, end_mark) + * elif event.type == YAML_SCALAR_EVENT: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_event->data.alias.anchor); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_anchor = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":587 + * elif event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(event.data.alias.anchor) + * return AliasEvent(anchor, start_mark, end_mark) # <<<<<<<<<<<<<< + * elif event.type == YAML_SCALAR_EVENT: + * anchor = None + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_AliasEvent); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_anchor); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_anchor); + __Pyx_GIVEREF(__pyx_v_anchor); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 2, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 587; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":588 + * anchor = PyUnicode_FromString(event.data.alias.anchor) + * return AliasEvent(anchor, start_mark, end_mark) + * elif event.type == YAML_SCALAR_EVENT: # <<<<<<<<<<<<<< + * anchor = None + * if event.data.scalar.anchor != NULL: + */ + case YAML_SCALAR_EVENT: + + /* "_yaml.pyx":589 + * return AliasEvent(anchor, start_mark, end_mark) + * elif event.type == YAML_SCALAR_EVENT: + * anchor = None # <<<<<<<<<<<<<< + * if event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.scalar.anchor) + */ + __Pyx_INCREF(Py_None); + __pyx_v_anchor = Py_None; + + /* "_yaml.pyx":590 + * elif event.type == YAML_SCALAR_EVENT: + * anchor = None + * if event.data.scalar.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(event.data.scalar.anchor) + * tag = None + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.anchor != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":591 + * anchor = None + * if event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.scalar.anchor) # <<<<<<<<<<<<<< + * tag = None + * if event.data.scalar.tag != NULL: + */ + __pyx_t_1 = PyUnicode_FromString(__pyx_v_event->data.scalar.anchor); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 591; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L11; + } + __pyx_L11:; + + /* "_yaml.pyx":592 + * if event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.scalar.anchor) + * tag = None # <<<<<<<<<<<<<< + * if event.data.scalar.tag != NULL: + * tag = PyUnicode_FromString(event.data.scalar.tag) + */ + __Pyx_INCREF(Py_None); + __pyx_v_tag = Py_None; + + /* "_yaml.pyx":593 + * anchor = PyUnicode_FromString(event.data.scalar.anchor) + * tag = None + * if event.data.scalar.tag != NULL: # <<<<<<<<<<<<<< + * tag = PyUnicode_FromString(event.data.scalar.tag) + * value = PyUnicode_DecodeUTF8(event.data.scalar.value, + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.tag != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":594 + * tag = None + * if event.data.scalar.tag != NULL: + * tag = PyUnicode_FromString(event.data.scalar.tag) # <<<<<<<<<<<<<< + * value = PyUnicode_DecodeUTF8(event.data.scalar.value, + * event.data.scalar.length, 'strict') + */ + __pyx_t_1 = PyUnicode_FromString(__pyx_v_event->data.scalar.tag); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_tag, __pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L12; + } + __pyx_L12:; + + /* "_yaml.pyx":595 + * if event.data.scalar.tag != NULL: + * tag = PyUnicode_FromString(event.data.scalar.tag) + * value = PyUnicode_DecodeUTF8(event.data.scalar.value, # <<<<<<<<<<<<<< + * event.data.scalar.length, 'strict') + * plain_implicit = False + */ + __pyx_t_1 = PyUnicode_DecodeUTF8(__pyx_v_event->data.scalar.value, __pyx_v_event->data.scalar.length, __pyx_k_strict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 595; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_value = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":597 + * value = PyUnicode_DecodeUTF8(event.data.scalar.value, + * event.data.scalar.length, 'strict') + * plain_implicit = False # <<<<<<<<<<<<<< + * if event.data.scalar.plain_implicit == 1: + * plain_implicit = True + */ + __pyx_v_plain_implicit = 0; + + /* "_yaml.pyx":598 + * event.data.scalar.length, 'strict') + * plain_implicit = False + * if event.data.scalar.plain_implicit == 1: # <<<<<<<<<<<<<< + * plain_implicit = True + * quoted_implicit = False + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.plain_implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":599 + * plain_implicit = False + * if event.data.scalar.plain_implicit == 1: + * plain_implicit = True # <<<<<<<<<<<<<< + * quoted_implicit = False + * if event.data.scalar.quoted_implicit == 1: + */ + __pyx_v_plain_implicit = 1; + goto __pyx_L13; + } + __pyx_L13:; + + /* "_yaml.pyx":600 + * if event.data.scalar.plain_implicit == 1: + * plain_implicit = True + * quoted_implicit = False # <<<<<<<<<<<<<< + * if event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True + */ + __pyx_v_quoted_implicit = 0; + + /* "_yaml.pyx":601 + * plain_implicit = True + * quoted_implicit = False + * if event.data.scalar.quoted_implicit == 1: # <<<<<<<<<<<<<< + * quoted_implicit = True + * style = None + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.quoted_implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":602 + * quoted_implicit = False + * if event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True # <<<<<<<<<<<<<< + * style = None + * if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + */ + __pyx_v_quoted_implicit = 1; + goto __pyx_L14; + } + __pyx_L14:; + + /* "_yaml.pyx":603 + * if event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True + * style = None # <<<<<<<<<<<<<< + * if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' + */ + __Pyx_INCREF(Py_None); + __pyx_v_style = Py_None; + + /* "_yaml.pyx":604 + * quoted_implicit = True + * style = None + * if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'' + * elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.style == YAML_PLAIN_SCALAR_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":605 + * style = None + * if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' # <<<<<<<<<<<<<< + * elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + */ + __Pyx_INCREF(__pyx_kp_u__6); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__6); + goto __pyx_L15; + } + + /* "_yaml.pyx":606 + * if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' + * elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'\'' + * elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":607 + * style = u'' + * elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' # <<<<<<<<<<<<<< + * elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + */ + __Pyx_INCREF(__pyx_kp_u__7); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__7); + goto __pyx_L15; + } + + /* "_yaml.pyx":608 + * elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + * elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'"' + * elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":609 + * style = u'\'' + * elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' # <<<<<<<<<<<<<< + * elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + */ + __Pyx_INCREF(__pyx_kp_u__8); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__8); + goto __pyx_L15; + } + + /* "_yaml.pyx":610 + * elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + * elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'|' + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.style == YAML_LITERAL_SCALAR_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":611 + * style = u'"' + * elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' # <<<<<<<<<<<<<< + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + */ + __Pyx_INCREF(__pyx_kp_u__9); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__9); + goto __pyx_L15; + } + + /* "_yaml.pyx":612 + * elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'>' + * return ScalarEvent(anchor, tag, + */ + __pyx_t_5 = ((__pyx_v_event->data.scalar.style == YAML_FOLDED_SCALAR_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":613 + * style = u'|' + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' # <<<<<<<<<<<<<< + * return ScalarEvent(anchor, tag, + * (plain_implicit, quoted_implicit), + */ + __Pyx_INCREF(__pyx_kp_u__10); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__10); + goto __pyx_L15; + } + __pyx_L15:; + + /* "_yaml.pyx":614 + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + * return ScalarEvent(anchor, tag, # <<<<<<<<<<<<<< + * (plain_implicit, quoted_implicit), + * value, start_mark, end_mark, style) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":615 + * style = u'>' + * return ScalarEvent(anchor, tag, + * (plain_implicit, quoted_implicit), # <<<<<<<<<<<<<< + * value, start_mark, end_mark, style) + * elif event.type == YAML_SEQUENCE_START_EVENT: + */ + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_plain_implicit); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_quoted_implicit); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 615; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_4 = 0; + __pyx_t_2 = 0; + + /* "_yaml.pyx":614 + * elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + * return ScalarEvent(anchor, tag, # <<<<<<<<<<<<<< + * (plain_implicit, quoted_implicit), + * value, start_mark, end_mark, style) + */ + __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_anchor); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_anchor); + __Pyx_GIVEREF(__pyx_v_anchor); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 4, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_2, 5, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_style); + PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_style); + __Pyx_GIVEREF(__pyx_v_style); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 614; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":617 + * (plain_implicit, quoted_implicit), + * value, start_mark, end_mark, style) + * elif event.type == YAML_SEQUENCE_START_EVENT: # <<<<<<<<<<<<<< + * anchor = None + * if event.data.sequence_start.anchor != NULL: + */ + case YAML_SEQUENCE_START_EVENT: + + /* "_yaml.pyx":618 + * value, start_mark, end_mark, style) + * elif event.type == YAML_SEQUENCE_START_EVENT: + * anchor = None # <<<<<<<<<<<<<< + * if event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.sequence_start.anchor) + */ + __Pyx_INCREF(Py_None); + __pyx_v_anchor = Py_None; + + /* "_yaml.pyx":619 + * elif event.type == YAML_SEQUENCE_START_EVENT: + * anchor = None + * if event.data.sequence_start.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(event.data.sequence_start.anchor) + * tag = None + */ + __pyx_t_5 = ((__pyx_v_event->data.sequence_start.anchor != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":620 + * anchor = None + * if event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.sequence_start.anchor) # <<<<<<<<<<<<<< + * tag = None + * if event.data.sequence_start.tag != NULL: + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_event->data.sequence_start.anchor); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 620; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L16; + } + __pyx_L16:; + + /* "_yaml.pyx":621 + * if event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.sequence_start.anchor) + * tag = None # <<<<<<<<<<<<<< + * if event.data.sequence_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.sequence_start.tag) + */ + __Pyx_INCREF(Py_None); + __pyx_v_tag = Py_None; + + /* "_yaml.pyx":622 + * anchor = PyUnicode_FromString(event.data.sequence_start.anchor) + * tag = None + * if event.data.sequence_start.tag != NULL: # <<<<<<<<<<<<<< + * tag = PyUnicode_FromString(event.data.sequence_start.tag) + * implicit = False + */ + __pyx_t_5 = ((__pyx_v_event->data.sequence_start.tag != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":623 + * tag = None + * if event.data.sequence_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.sequence_start.tag) # <<<<<<<<<<<<<< + * implicit = False + * if event.data.sequence_start.implicit == 1: + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_event->data.sequence_start.tag); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 623; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_tag, __pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L17; + } + __pyx_L17:; + + /* "_yaml.pyx":624 + * if event.data.sequence_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.sequence_start.tag) + * implicit = False # <<<<<<<<<<<<<< + * if event.data.sequence_start.implicit == 1: + * implicit = True + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":625 + * tag = PyUnicode_FromString(event.data.sequence_start.tag) + * implicit = False + * if event.data.sequence_start.implicit == 1: # <<<<<<<<<<<<<< + * implicit = True + * flow_style = None + */ + __pyx_t_5 = ((__pyx_v_event->data.sequence_start.implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":626 + * implicit = False + * if event.data.sequence_start.implicit == 1: + * implicit = True # <<<<<<<<<<<<<< + * flow_style = None + * if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + */ + __pyx_v_implicit = 1; + goto __pyx_L18; + } + __pyx_L18:; + + /* "_yaml.pyx":627 + * if event.data.sequence_start.implicit == 1: + * implicit = True + * flow_style = None # <<<<<<<<<<<<<< + * if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True + */ + __Pyx_INCREF(Py_None); + __pyx_v_flow_style = Py_None; + + /* "_yaml.pyx":628 + * implicit = True + * flow_style = None + * if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: # <<<<<<<<<<<<<< + * flow_style = True + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":629 + * flow_style = None + * if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True # <<<<<<<<<<<<<< + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False + */ + __Pyx_INCREF(Py_True); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_True); + goto __pyx_L19; + } + + /* "_yaml.pyx":630 + * if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * return SequenceStartEvent(anchor, tag, implicit, + */ + __pyx_t_5 = ((__pyx_v_event->data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":631 + * flow_style = True + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False # <<<<<<<<<<<<<< + * return SequenceStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) + */ + __Pyx_INCREF(Py_False); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_False); + goto __pyx_L19; + } + __pyx_L19:; + + /* "_yaml.pyx":632 + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False + * return SequenceStartEvent(anchor, tag, implicit, # <<<<<<<<<<<<<< + * start_mark, end_mark, flow_style) + * elif event.type == YAML_MAPPING_START_EVENT: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceStartEvent); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_implicit); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":633 + * flow_style = False + * return SequenceStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) # <<<<<<<<<<<<<< + * elif event.type == YAML_MAPPING_START_EVENT: + * anchor = None + */ + __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_anchor); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_anchor); + __Pyx_GIVEREF(__pyx_v_anchor); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 3, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 4, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_flow_style); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_flow_style); + __Pyx_GIVEREF(__pyx_v_flow_style); + __pyx_t_2 = 0; + + /* "_yaml.pyx":632 + * elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False + * return SequenceStartEvent(anchor, tag, implicit, # <<<<<<<<<<<<<< + * start_mark, end_mark, flow_style) + * elif event.type == YAML_MAPPING_START_EVENT: + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 632; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":634 + * return SequenceStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) + * elif event.type == YAML_MAPPING_START_EVENT: # <<<<<<<<<<<<<< + * anchor = None + * if event.data.mapping_start.anchor != NULL: + */ + case YAML_MAPPING_START_EVENT: + + /* "_yaml.pyx":635 + * start_mark, end_mark, flow_style) + * elif event.type == YAML_MAPPING_START_EVENT: + * anchor = None # <<<<<<<<<<<<<< + * if event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.mapping_start.anchor) + */ + __Pyx_INCREF(Py_None); + __pyx_v_anchor = Py_None; + + /* "_yaml.pyx":636 + * elif event.type == YAML_MAPPING_START_EVENT: + * anchor = None + * if event.data.mapping_start.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(event.data.mapping_start.anchor) + * tag = None + */ + __pyx_t_5 = ((__pyx_v_event->data.mapping_start.anchor != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":637 + * anchor = None + * if event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.mapping_start.anchor) # <<<<<<<<<<<<<< + * tag = None + * if event.data.mapping_start.tag != NULL: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_event->data.mapping_start.anchor); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 637; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L20; + } + __pyx_L20:; + + /* "_yaml.pyx":638 + * if event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(event.data.mapping_start.anchor) + * tag = None # <<<<<<<<<<<<<< + * if event.data.mapping_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.mapping_start.tag) + */ + __Pyx_INCREF(Py_None); + __pyx_v_tag = Py_None; + + /* "_yaml.pyx":639 + * anchor = PyUnicode_FromString(event.data.mapping_start.anchor) + * tag = None + * if event.data.mapping_start.tag != NULL: # <<<<<<<<<<<<<< + * tag = PyUnicode_FromString(event.data.mapping_start.tag) + * implicit = False + */ + __pyx_t_5 = ((__pyx_v_event->data.mapping_start.tag != NULL) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":640 + * tag = None + * if event.data.mapping_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.mapping_start.tag) # <<<<<<<<<<<<<< + * implicit = False + * if event.data.mapping_start.implicit == 1: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_event->data.mapping_start.tag); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF_SET(__pyx_v_tag, __pyx_t_2); + __pyx_t_2 = 0; + goto __pyx_L21; + } + __pyx_L21:; + + /* "_yaml.pyx":641 + * if event.data.mapping_start.tag != NULL: + * tag = PyUnicode_FromString(event.data.mapping_start.tag) + * implicit = False # <<<<<<<<<<<<<< + * if event.data.mapping_start.implicit == 1: + * implicit = True + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":642 + * tag = PyUnicode_FromString(event.data.mapping_start.tag) + * implicit = False + * if event.data.mapping_start.implicit == 1: # <<<<<<<<<<<<<< + * implicit = True + * flow_style = None + */ + __pyx_t_5 = ((__pyx_v_event->data.mapping_start.implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":643 + * implicit = False + * if event.data.mapping_start.implicit == 1: + * implicit = True # <<<<<<<<<<<<<< + * flow_style = None + * if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + */ + __pyx_v_implicit = 1; + goto __pyx_L22; + } + __pyx_L22:; + + /* "_yaml.pyx":644 + * if event.data.mapping_start.implicit == 1: + * implicit = True + * flow_style = None # <<<<<<<<<<<<<< + * if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True + */ + __Pyx_INCREF(Py_None); + __pyx_v_flow_style = Py_None; + + /* "_yaml.pyx":645 + * implicit = True + * flow_style = None + * if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: # <<<<<<<<<<<<<< + * flow_style = True + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + */ + __pyx_t_5 = ((__pyx_v_event->data.mapping_start.style == YAML_FLOW_MAPPING_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":646 + * flow_style = None + * if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True # <<<<<<<<<<<<<< + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False + */ + __Pyx_INCREF(Py_True); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_True); + goto __pyx_L23; + } + + /* "_yaml.pyx":647 + * if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * return MappingStartEvent(anchor, tag, implicit, + */ + __pyx_t_5 = ((__pyx_v_event->data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":648 + * flow_style = True + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False # <<<<<<<<<<<<<< + * return MappingStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) + */ + __Pyx_INCREF(Py_False); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_False); + goto __pyx_L23; + } + __pyx_L23:; + + /* "_yaml.pyx":649 + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False + * return MappingStartEvent(anchor, tag, implicit, # <<<<<<<<<<<<<< + * start_mark, end_mark, flow_style) + * elif event.type == YAML_SEQUENCE_END_EVENT: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingStartEvent); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_implicit); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":650 + * flow_style = False + * return MappingStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) # <<<<<<<<<<<<<< + * elif event.type == YAML_SEQUENCE_END_EVENT: + * return SequenceEndEvent(start_mark, end_mark) + */ + __pyx_t_3 = PyTuple_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_anchor); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_anchor); + __Pyx_GIVEREF(__pyx_v_anchor); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 4, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_flow_style); + PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_v_flow_style); + __Pyx_GIVEREF(__pyx_v_flow_style); + __pyx_t_1 = 0; + + /* "_yaml.pyx":649 + * elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False + * return MappingStartEvent(anchor, tag, implicit, # <<<<<<<<<<<<<< + * start_mark, end_mark, flow_style) + * elif event.type == YAML_SEQUENCE_END_EVENT: + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 649; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":651 + * return MappingStartEvent(anchor, tag, implicit, + * start_mark, end_mark, flow_style) + * elif event.type == YAML_SEQUENCE_END_EVENT: # <<<<<<<<<<<<<< + * return SequenceEndEvent(start_mark, end_mark) + * elif event.type == YAML_MAPPING_END_EVENT: + */ + case YAML_SEQUENCE_END_EVENT: + + /* "_yaml.pyx":652 + * start_mark, end_mark, flow_style) + * elif event.type == YAML_SEQUENCE_END_EVENT: + * return SequenceEndEvent(start_mark, end_mark) # <<<<<<<<<<<<<< + * elif event.type == YAML_MAPPING_END_EVENT: + * return MappingEndEvent(start_mark, end_mark) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 652; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L0; + break; + + /* "_yaml.pyx":653 + * elif event.type == YAML_SEQUENCE_END_EVENT: + * return SequenceEndEvent(start_mark, end_mark) + * elif event.type == YAML_MAPPING_END_EVENT: # <<<<<<<<<<<<<< + * return MappingEndEvent(start_mark, end_mark) + * else: + */ + case YAML_MAPPING_END_EVENT: + + /* "_yaml.pyx":654 + * return SequenceEndEvent(start_mark, end_mark) + * elif event.type == YAML_MAPPING_END_EVENT: + * return MappingEndEvent(start_mark, end_mark) # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingEndEvent); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 654; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + break; + default: + + /* "_yaml.pyx":656 + * return MappingEndEvent(start_mark, end_mark) + * else: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("unknown event type") + * else: + */ + __pyx_t_5 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":657 + * else: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("unknown event type") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown event type") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":659 + * raise ValueError("unknown event type") + * else: + * raise ValueError(u"unknown event type") # <<<<<<<<<<<<<< + * + * def get_event(self): + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + + /* "_yaml.pyx":535 + * return event_object + * + * cdef object _event_to_object(self, yaml_event_t *event): # <<<<<<<<<<<<<< + * cdef yaml_tag_directive_t *tag_directive + * start_mark = Mark(self.stream_name, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.CParser._event_to_object", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_start_mark); + __Pyx_XDECREF((PyObject *)__pyx_v_end_mark); + __Pyx_XDECREF(__pyx_v_encoding); + __Pyx_XDECREF(__pyx_v_version); + __Pyx_XDECREF(__pyx_v_tags); + __Pyx_XDECREF(__pyx_v_handle); + __Pyx_XDECREF(__pyx_v_prefix); + __Pyx_XDECREF(__pyx_v_anchor); + __Pyx_XDECREF(__pyx_v_tag); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_style); + __Pyx_XDECREF(__pyx_v_flow_style); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":661 + * raise ValueError(u"unknown event type") + * + * def get_event(self): # <<<<<<<<<<<<<< + * if self.current_event is not None: + * value = self.current_event + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_17get_event(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_17get_event(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_event (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_16get_event(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_16get_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_event", 0); + + /* "_yaml.pyx":662 + * + * def get_event(self): + * if self.current_event is not None: # <<<<<<<<<<<<<< + * value = self.current_event + * self.current_event = None + */ + __pyx_t_1 = (__pyx_v_self->current_event != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":663 + * def get_event(self): + * if self.current_event is not None: + * value = self.current_event # <<<<<<<<<<<<<< + * self.current_event = None + * else: + */ + __pyx_t_3 = __pyx_v_self->current_event; + __Pyx_INCREF(__pyx_t_3); + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":664 + * if self.current_event is not None: + * value = self.current_event + * self.current_event = None # <<<<<<<<<<<<<< + * else: + * value = self._parse() + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->current_event); + __Pyx_DECREF(__pyx_v_self->current_event); + __pyx_v_self->current_event = Py_None; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":666 + * self.current_event = None + * else: + * value = self._parse() # <<<<<<<<<<<<<< + * return value + * + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 666; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_value = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_L3:; + + /* "_yaml.pyx":667 + * else: + * value = self._parse() + * return value # <<<<<<<<<<<<<< + * + * def peek_event(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_value); + __pyx_r = __pyx_v_value; + goto __pyx_L0; + + /* "_yaml.pyx":661 + * raise ValueError(u"unknown event type") + * + * def get_event(self): # <<<<<<<<<<<<<< + * if self.current_event is not None: + * value = self.current_event + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.get_event", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":669 + * return value + * + * def peek_event(self): # <<<<<<<<<<<<<< + * if self.current_event is None: + * self.current_event = self._parse() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_19peek_event(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_19peek_event(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("peek_event (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_18peek_event(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_18peek_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("peek_event", 0); + + /* "_yaml.pyx":670 + * + * def peek_event(self): + * if self.current_event is None: # <<<<<<<<<<<<<< + * self.current_event = self._parse() + * return self.current_event + */ + __pyx_t_1 = (__pyx_v_self->current_event == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":671 + * def peek_event(self): + * if self.current_event is None: + * self.current_event = self._parse() # <<<<<<<<<<<<<< + * return self.current_event + * + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 671; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->current_event); + __Pyx_DECREF(__pyx_v_self->current_event); + __pyx_v_self->current_event = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":672 + * if self.current_event is None: + * self.current_event = self._parse() + * return self.current_event # <<<<<<<<<<<<<< + * + * def check_event(self, *choices): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->current_event); + __pyx_r = __pyx_v_self->current_event; + goto __pyx_L0; + + /* "_yaml.pyx":669 + * return value + * + * def peek_event(self): # <<<<<<<<<<<<<< + * if self.current_event is None: + * self.current_event = self._parse() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.peek_event", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":674 + * return self.current_event + * + * def check_event(self, *choices): # <<<<<<<<<<<<<< + * if self.current_event is None: + * self.current_event = self._parse() + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_21check_event(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_21check_event(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_choices = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("check_event (wrapper)", 0); + if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "check_event", 0))) return NULL; + __Pyx_INCREF(__pyx_args); + __pyx_v_choices = __pyx_args; + __pyx_r = __pyx_pf_5_yaml_7CParser_20check_event(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self), __pyx_v_choices); + + /* function exit code */ + __Pyx_XDECREF(__pyx_v_choices); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_20check_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_choices) { + PyObject *__pyx_v_event_class = NULL; + PyObject *__pyx_v_choice = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_event", 0); + + /* "_yaml.pyx":675 + * + * def check_event(self, *choices): + * if self.current_event is None: # <<<<<<<<<<<<<< + * self.current_event = self._parse() + * if self.current_event is None: + */ + __pyx_t_1 = (__pyx_v_self->current_event == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":676 + * def check_event(self, *choices): + * if self.current_event is None: + * self.current_event = self._parse() # <<<<<<<<<<<<<< + * if self.current_event is None: + * return False + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->current_event); + __Pyx_DECREF(__pyx_v_self->current_event); + __pyx_v_self->current_event = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":677 + * if self.current_event is None: + * self.current_event = self._parse() + * if self.current_event is None: # <<<<<<<<<<<<<< + * return False + * if not choices: + */ + __pyx_t_2 = (__pyx_v_self->current_event == Py_None); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":678 + * self.current_event = self._parse() + * if self.current_event is None: + * return False # <<<<<<<<<<<<<< + * if not choices: + * return True + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + } + + /* "_yaml.pyx":679 + * if self.current_event is None: + * return False + * if not choices: # <<<<<<<<<<<<<< + * return True + * event_class = self.current_event.__class__ + */ + __pyx_t_1 = (__pyx_v_choices != Py_None) && (PyTuple_GET_SIZE(__pyx_v_choices) != 0); + __pyx_t_2 = ((!__pyx_t_1) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":680 + * return False + * if not choices: + * return True # <<<<<<<<<<<<<< + * event_class = self.current_event.__class__ + * for choice in choices: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + } + + /* "_yaml.pyx":681 + * if not choices: + * return True + * event_class = self.current_event.__class__ # <<<<<<<<<<<<<< + * for choice in choices: + * if event_class is choice: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->current_event, __pyx_n_s_class); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 681; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_event_class = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":682 + * return True + * event_class = self.current_event.__class__ + * for choice in choices: # <<<<<<<<<<<<<< + * if event_class is choice: + * return True + */ + __pyx_t_3 = __pyx_v_choices; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0; + for (;;) { + if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_5); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 682; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_5 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 682; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + __Pyx_XDECREF_SET(__pyx_v_choice, __pyx_t_5); + __pyx_t_5 = 0; + + /* "_yaml.pyx":683 + * event_class = self.current_event.__class__ + * for choice in choices: + * if event_class is choice: # <<<<<<<<<<<<<< + * return True + * return False + */ + __pyx_t_2 = (__pyx_v_event_class == __pyx_v_choice); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":684 + * for choice in choices: + * if event_class is choice: + * return True # <<<<<<<<<<<<<< + * return False + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L0; + } + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":685 + * if event_class is choice: + * return True + * return False # <<<<<<<<<<<<<< + * + * def check_node(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_yaml.pyx":674 + * return self.current_event + * + * def check_event(self, *choices): # <<<<<<<<<<<<<< + * if self.current_event is None: + * self.current_event = self._parse() + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_yaml.CParser.check_event", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_event_class); + __Pyx_XDECREF(__pyx_v_choice); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":687 + * return False + * + * def check_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type == YAML_STREAM_START_EVENT: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_23check_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_23check_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("check_node (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_22check_node(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_22check_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("check_node", 0); + + /* "_yaml.pyx":688 + * + * def check_node(self): + * self._parse_next_event() # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_STREAM_START_EVENT: + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 688; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":689 + * def check_node(self): + * self._parse_next_event() + * if self.parsed_event.type == YAML_STREAM_START_EVENT: # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type == YAML_STREAM_START_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":690 + * self._parse_next_event() + * if self.parsed_event.type == YAML_STREAM_START_EVENT: + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":691 + * if self.parsed_event.type == YAML_STREAM_START_EVENT: + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() # <<<<<<<<<<<<<< + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * return True + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 691; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":692 + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: # <<<<<<<<<<<<<< + * return True + * return False + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type != YAML_STREAM_END_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":693 + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * return True # <<<<<<<<<<<<<< + * return False + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_True); + __pyx_r = Py_True; + goto __pyx_L0; + } + + /* "_yaml.pyx":694 + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * return True + * return False # <<<<<<<<<<<<<< + * + * def get_node(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_False); + __pyx_r = Py_False; + goto __pyx_L0; + + /* "_yaml.pyx":687 + * return False + * + * def check_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type == YAML_STREAM_START_EVENT: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("_yaml.CParser.check_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":696 + * return False + * + * def get_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_25get_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_25get_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_node (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_24get_node(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_24get_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_node", 0); + + /* "_yaml.pyx":697 + * + * def get_node(self): + * self._parse_next_event() # <<<<<<<<<<<<<< + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * return self._compose_document() + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 697; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":698 + * def get_node(self): + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: # <<<<<<<<<<<<<< + * return self._compose_document() + * + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type != YAML_STREAM_END_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":699 + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * return self._compose_document() # <<<<<<<<<<<<<< + * + * def get_single_node(self): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_document(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 699; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + } + + /* "_yaml.pyx":696 + * return False + * + * def get_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser.get_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":701 + * return self._compose_document() + * + * def get_single_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_7CParser_27get_single_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_7CParser_27get_single_node(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("get_single_node (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_7CParser_26get_single_node(((struct __pyx_obj_5_yaml_CParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_7CParser_26get_single_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_document = NULL; + struct __pyx_obj_5_yaml_Mark *__pyx_v_mark = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("get_single_node", 0); + + /* "_yaml.pyx":702 + * + * def get_single_node(self): + * self._parse_next_event() # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 702; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":703 + * def get_single_node(self): + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * self._parse_next_event() + * document = None + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":704 + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() # <<<<<<<<<<<<<< + * document = None + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 704; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":705 + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + * document = None # <<<<<<<<<<<<<< + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * document = self._compose_document() + */ + __Pyx_INCREF(Py_None); + __pyx_v_document = Py_None; + + /* "_yaml.pyx":706 + * self._parse_next_event() + * document = None + * if self.parsed_event.type != YAML_STREAM_END_EVENT: # <<<<<<<<<<<<<< + * document = self._compose_document() + * self._parse_next_event() + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type != YAML_STREAM_END_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":707 + * document = None + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * document = self._compose_document() # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_document(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 707; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_document, __pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":708 + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * document = self._compose_document() + * self._parse_next_event() # <<<<<<<<<<<<<< + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * mark = Mark(self.stream_name, + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":709 + * document = self._compose_document() + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: # <<<<<<<<<<<<<< + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type != YAML_STREAM_END_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":711 + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 711; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":712 + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 712; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":713 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":710 + * self._parse_next_event() + * if self.parsed_event.type != YAML_STREAM_END_EVENT: + * mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_6 = PyTuple_New(6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_6, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_6, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_v_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "_yaml.pyx":715 + * self.parsed_event.start_mark.column, + * None, None) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ComposerError("expected a single document in the stream", + * document.start_mark, "but found another document", mark) + */ + __pyx_t_2 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":716 + * None, None) + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("expected a single document in the stream", # <<<<<<<<<<<<<< + * document.start_mark, "but found another document", mark) + * else: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":717 + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("expected a single document in the stream", + * document.start_mark, "but found another document", mark) # <<<<<<<<<<<<<< + * else: + * raise ComposerError(u"expected a single document in the stream", + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_document, __pyx_n_s_start_mark); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 717; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + + /* "_yaml.pyx":716 + * None, None) + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("expected a single document in the stream", # <<<<<<<<<<<<<< + * document.start_mark, "but found another document", mark) + * else: + */ + __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_kp_s_expected_a_single_document_in_th); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_kp_s_expected_a_single_document_in_th); + __Pyx_GIVEREF(__pyx_kp_s_expected_a_single_document_in_th); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_INCREF(__pyx_kp_s_but_found_another_document); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_kp_s_but_found_another_document); + __Pyx_GIVEREF(__pyx_kp_s_but_found_another_document); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_4, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":719 + * document.start_mark, "but found another document", mark) + * else: + * raise ComposerError(u"expected a single document in the stream", # <<<<<<<<<<<<<< + * document.start_mark, u"but found another document", mark) + * return document + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + + /* "_yaml.pyx":720 + * else: + * raise ComposerError(u"expected a single document in the stream", + * document.start_mark, u"but found another document", mark) # <<<<<<<<<<<<<< + * return document + * + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_document, __pyx_n_s_start_mark); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 720; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":719 + * document.start_mark, "but found another document", mark) + * else: + * raise ComposerError(u"expected a single document in the stream", # <<<<<<<<<<<<<< + * document.start_mark, u"but found another document", mark) + * return document + */ + __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_kp_u_expected_a_single_document_in_th); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_kp_u_expected_a_single_document_in_th); + __Pyx_GIVEREF(__pyx_kp_u_expected_a_single_document_in_th); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(__pyx_kp_u_but_found_another_document); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_u_but_found_another_document); + __Pyx_GIVEREF(__pyx_kp_u_but_found_another_document); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_5, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":721 + * raise ComposerError(u"expected a single document in the stream", + * document.start_mark, u"but found another document", mark) + * return document # <<<<<<<<<<<<<< + * + * cdef object _compose_document(self): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_document); + __pyx_r = __pyx_v_document; + goto __pyx_L0; + + /* "_yaml.pyx":701 + * return self._compose_document() + * + * def get_single_node(self): # <<<<<<<<<<<<<< + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_yaml.CParser.get_single_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_document); + __Pyx_XDECREF((PyObject *)__pyx_v_mark); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":723 + * return document + * + * cdef object _compose_document(self): # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * node = self._compose_node(None, None) + */ + +static PyObject *__pyx_f_5_yaml_7CParser__compose_document(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_node = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_compose_document", 0); + + /* "_yaml.pyx":724 + * + * cdef object _compose_document(self): + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * node = self._compose_node(None, None) + * self._parse_next_event() + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":725 + * cdef object _compose_document(self): + * yaml_event_delete(&self.parsed_event) + * node = self._compose_node(None, None) # <<<<<<<<<<<<<< + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_node(__pyx_v_self, Py_None, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_node = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":726 + * yaml_event_delete(&self.parsed_event) + * node = self._compose_node(None, None) + * self._parse_next_event() # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * self.anchors = {} + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_2 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 726; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":727 + * node = self._compose_node(None, None) + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * self.anchors = {} + * return node + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":728 + * self._parse_next_event() + * yaml_event_delete(&self.parsed_event) + * self.anchors = {} # <<<<<<<<<<<<<< + * return node + * + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 728; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->anchors); + __Pyx_DECREF(__pyx_v_self->anchors); + __pyx_v_self->anchors = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":729 + * yaml_event_delete(&self.parsed_event) + * self.anchors = {} + * return node # <<<<<<<<<<<<<< + * + * cdef object _compose_node(self, object parent, object index): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_node); + __pyx_r = __pyx_v_node; + goto __pyx_L0; + + /* "_yaml.pyx":723 + * return document + * + * cdef object _compose_document(self): # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * node = self._compose_node(None, None) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("_yaml.CParser._compose_document", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_node); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":731 + * return node + * + * cdef object _compose_node(self, object parent, object index): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type == YAML_ALIAS_EVENT: + */ + +static PyObject *__pyx_f_5_yaml_7CParser__compose_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_parent, PyObject *__pyx_v_index) { + PyObject *__pyx_v_anchor = NULL; + struct __pyx_obj_5_yaml_Mark *__pyx_v_mark = NULL; + PyObject *__pyx_v_node = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_compose_node", 0); + + /* "_yaml.pyx":732 + * + * cdef object _compose_node(self, object parent, object index): + * self._parse_next_event() # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":733 + * cdef object _compose_node(self, object parent, object index): + * self._parse_next_event() + * if self.parsed_event.type == YAML_ALIAS_EVENT: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) + * if anchor not in self.anchors: + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type == YAML_ALIAS_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":734 + * self._parse_next_event() + * if self.parsed_event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) # <<<<<<<<<<<<<< + * if anchor not in self.anchors: + * mark = Mark(self.stream_name, + */ + __pyx_t_3 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.alias.anchor); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 734; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_anchor = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":735 + * if self.parsed_event.type == YAML_ALIAS_EVENT: + * anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) + * if anchor not in self.anchors: # <<<<<<<<<<<<<< + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_anchor, __pyx_v_self->anchors, Py_NE)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 735; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":737 + * if anchor not in self.anchors: + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 737; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":738 + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 738; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":739 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 739; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + + /* "_yaml.pyx":736 + * anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) + * if anchor not in self.anchors: + * mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_7 = PyTuple_New(6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_7, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 736; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_v_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_6); + __pyx_t_6 = 0; + + /* "_yaml.pyx":741 + * self.parsed_event.start_mark.column, + * None, None) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ComposerError(None, None, "found undefined alias", mark) + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":742 + * None, None) + * if PY_MAJOR_VERSION < 3: + * raise ComposerError(None, None, "found undefined alias", mark) # <<<<<<<<<<<<<< + * else: + * raise ComposerError(None, None, u"found undefined alias", mark) + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 0, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 1, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(__pyx_kp_s_found_undefined_alias); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_kp_s_found_undefined_alias); + __Pyx_GIVEREF(__pyx_kp_s_found_undefined_alias); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_7, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 742; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":744 + * raise ComposerError(None, None, "found undefined alias", mark) + * else: + * raise ComposerError(None, None, u"found undefined alias", mark) # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * return self.anchors[anchor] + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 0, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_7, 1, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(__pyx_kp_u_found_undefined_alias); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_kp_u_found_undefined_alias); + __Pyx_GIVEREF(__pyx_kp_u_found_undefined_alias); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_7, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":745 + * else: + * raise ComposerError(None, None, u"found undefined alias", mark) + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * return self.anchors[anchor] + * anchor = None + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":746 + * raise ComposerError(None, None, u"found undefined alias", mark) + * yaml_event_delete(&self.parsed_event) + * return self.anchors[anchor] # <<<<<<<<<<<<<< + * anchor = None + * if self.parsed_event.type == YAML_SCALAR_EVENT \ + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_6 = PyObject_GetItem(__pyx_v_self->anchors, __pyx_v_anchor); if (unlikely(__pyx_t_6 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 746; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_6); + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + } + + /* "_yaml.pyx":747 + * yaml_event_delete(&self.parsed_event) + * return self.anchors[anchor] + * anchor = None # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_SCALAR_EVENT \ + * and self.parsed_event.data.scalar.anchor != NULL: + */ + __Pyx_INCREF(Py_None); + __pyx_v_anchor = Py_None; + + /* "_yaml.pyx":748 + * return self.anchors[anchor] + * anchor = None + * if self.parsed_event.type == YAML_SCALAR_EVENT \ # <<<<<<<<<<<<<< + * and self.parsed_event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) + */ + __pyx_t_4 = ((__pyx_v_self->parsed_event.type == YAML_SCALAR_EVENT) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":749 + * anchor = None + * if self.parsed_event.type == YAML_SCALAR_EVENT \ + * and self.parsed_event.data.scalar.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.data.scalar.anchor != NULL) != 0); + __pyx_t_8 = __pyx_t_2; + } else { + __pyx_t_8 = __pyx_t_4; + } + if (__pyx_t_8) { + + /* "_yaml.pyx":750 + * if self.parsed_event.type == YAML_SCALAR_EVENT \ + * and self.parsed_event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) # <<<<<<<<<<<<<< + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ + * and self.parsed_event.data.sequence_start.anchor != NULL: + */ + __pyx_t_6 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.scalar.anchor); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 750; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L6; + } + + /* "_yaml.pyx":751 + * and self.parsed_event.data.scalar.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ # <<<<<<<<<<<<<< + * and self.parsed_event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) + */ + __pyx_t_8 = ((__pyx_v_self->parsed_event.type == YAML_SEQUENCE_START_EVENT) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":752 + * anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ + * and self.parsed_event.data.sequence_start.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ + */ + __pyx_t_4 = ((__pyx_v_self->parsed_event.data.sequence_start.anchor != NULL) != 0); + __pyx_t_2 = __pyx_t_4; + } else { + __pyx_t_2 = __pyx_t_8; + } + if (__pyx_t_2) { + + /* "_yaml.pyx":753 + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ + * and self.parsed_event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) # <<<<<<<<<<<<<< + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ + * and self.parsed_event.data.mapping_start.anchor != NULL: + */ + __pyx_t_6 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.sequence_start.anchor); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 753; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L6; + } + + /* "_yaml.pyx":754 + * and self.parsed_event.data.sequence_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ # <<<<<<<<<<<<<< + * and self.parsed_event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) + */ + __pyx_t_2 = ((__pyx_v_self->parsed_event.type == YAML_MAPPING_START_EVENT) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":755 + * anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ + * and self.parsed_event.data.mapping_start.anchor != NULL: # <<<<<<<<<<<<<< + * anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) + * if anchor is not None: + */ + __pyx_t_8 = ((__pyx_v_self->parsed_event.data.mapping_start.anchor != NULL) != 0); + __pyx_t_4 = __pyx_t_8; + } else { + __pyx_t_4 = __pyx_t_2; + } + if (__pyx_t_4) { + + /* "_yaml.pyx":756 + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ + * and self.parsed_event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) # <<<<<<<<<<<<<< + * if anchor is not None: + * if anchor in self.anchors: + */ + __pyx_t_6 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.mapping_start.anchor); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_anchor, __pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":757 + * and self.parsed_event.data.mapping_start.anchor != NULL: + * anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) + * if anchor is not None: # <<<<<<<<<<<<<< + * if anchor in self.anchors: + * mark = Mark(self.stream_name, + */ + __pyx_t_4 = (__pyx_v_anchor != Py_None); + __pyx_t_2 = (__pyx_t_4 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":758 + * anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) + * if anchor is not None: + * if anchor in self.anchors: # <<<<<<<<<<<<<< + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + __pyx_t_2 = (__Pyx_PySequence_Contains(__pyx_v_anchor, __pyx_v_self->anchors, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 758; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":760 + * if anchor in self.anchors: + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + + /* "_yaml.pyx":761 + * mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 761; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + + /* "_yaml.pyx":762 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":759 + * if anchor is not None: + * if anchor in self.anchors: + * mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_3 = PyTuple_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_3, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 759; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_5); + __pyx_t_5 = 0; + + /* "_yaml.pyx":764 + * self.parsed_event.start_mark.column, + * None, None) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ComposerError("found duplicate anchor; first occurence", + * self.anchors[anchor].start_mark, "second occurence", mark) + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":765 + * None, None) + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("found duplicate anchor; first occurence", # <<<<<<<<<<<<<< + * self.anchors[anchor].start_mark, "second occurence", mark) + * else: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + + /* "_yaml.pyx":766 + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("found duplicate anchor; first occurence", + * self.anchors[anchor].start_mark, "second occurence", mark) # <<<<<<<<<<<<<< + * else: + * raise ComposerError(u"found duplicate anchor; first occurence", + */ + __pyx_t_3 = PyObject_GetItem(__pyx_v_self->anchors, __pyx_v_anchor); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_start_mark); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":765 + * None, None) + * if PY_MAJOR_VERSION < 3: + * raise ComposerError("found duplicate anchor; first occurence", # <<<<<<<<<<<<<< + * self.anchors[anchor].start_mark, "second occurence", mark) + * else: + */ + __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_kp_s_found_duplicate_anchor_first_occ); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_s_found_duplicate_anchor_first_occ); + __Pyx_GIVEREF(__pyx_kp_s_found_duplicate_anchor_first_occ); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_INCREF(__pyx_kp_s_second_occurence); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_s_second_occurence); + __Pyx_GIVEREF(__pyx_kp_s_second_occurence); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_7, 0, 0, 0); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":768 + * self.anchors[anchor].start_mark, "second occurence", mark) + * else: + * raise ComposerError(u"found duplicate anchor; first occurence", # <<<<<<<<<<<<<< + * self.anchors[anchor].start_mark, u"second occurence", mark) + * self.descend_resolver(parent, index) + */ + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_ComposerError); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + + /* "_yaml.pyx":769 + * else: + * raise ComposerError(u"found duplicate anchor; first occurence", + * self.anchors[anchor].start_mark, u"second occurence", mark) # <<<<<<<<<<<<<< + * self.descend_resolver(parent, index) + * if self.parsed_event.type == YAML_SCALAR_EVENT: + */ + __pyx_t_3 = PyObject_GetItem(__pyx_v_self->anchors, __pyx_v_anchor); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_start_mark); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":768 + * self.anchors[anchor].start_mark, "second occurence", mark) + * else: + * raise ComposerError(u"found duplicate anchor; first occurence", # <<<<<<<<<<<<<< + * self.anchors[anchor].start_mark, u"second occurence", mark) + * self.descend_resolver(parent, index) + */ + __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_kp_u_found_duplicate_anchor_first_occ); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_u_found_duplicate_anchor_first_occ); + __Pyx_GIVEREF(__pyx_kp_u_found_duplicate_anchor_first_occ); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_INCREF(__pyx_kp_u_second_occurence); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_kp_u_second_occurence); + __Pyx_GIVEREF(__pyx_kp_u_second_occurence); + __Pyx_INCREF(((PyObject *)__pyx_v_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_mark)); + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 768; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + goto __pyx_L7; + } + __pyx_L7:; + + /* "_yaml.pyx":770 + * raise ComposerError(u"found duplicate anchor; first occurence", + * self.anchors[anchor].start_mark, u"second occurence", mark) + * self.descend_resolver(parent, index) # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_SCALAR_EVENT: + * node = self._compose_scalar_node(anchor) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_descend_resolver); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_parent); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_parent); + __Pyx_GIVEREF(__pyx_v_parent); + __Pyx_INCREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 770; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_yaml.pyx":775 + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + * node = self._compose_sequence_node(anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: # <<<<<<<<<<<<<< + * node = self._compose_mapping_node(anchor) + * self.ascend_resolver() + */ + switch (__pyx_v_self->parsed_event.type) { + + /* "_yaml.pyx":771 + * self.anchors[anchor].start_mark, u"second occurence", mark) + * self.descend_resolver(parent, index) + * if self.parsed_event.type == YAML_SCALAR_EVENT: # <<<<<<<<<<<<<< + * node = self._compose_scalar_node(anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + */ + case YAML_SCALAR_EVENT: + + /* "_yaml.pyx":772 + * self.descend_resolver(parent, index) + * if self.parsed_event.type == YAML_SCALAR_EVENT: + * node = self._compose_scalar_node(anchor) # <<<<<<<<<<<<<< + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + * node = self._compose_sequence_node(anchor) + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_scalar_node(__pyx_v_self, __pyx_v_anchor); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_node = __pyx_t_7; + __pyx_t_7 = 0; + break; + + /* "_yaml.pyx":773 + * if self.parsed_event.type == YAML_SCALAR_EVENT: + * node = self._compose_scalar_node(anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: # <<<<<<<<<<<<<< + * node = self._compose_sequence_node(anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: + */ + case YAML_SEQUENCE_START_EVENT: + + /* "_yaml.pyx":774 + * node = self._compose_scalar_node(anchor) + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + * node = self._compose_sequence_node(anchor) # <<<<<<<<<<<<<< + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: + * node = self._compose_mapping_node(anchor) + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_sequence_node(__pyx_v_self, __pyx_v_anchor); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_node = __pyx_t_7; + __pyx_t_7 = 0; + break; + + /* "_yaml.pyx":775 + * elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + * node = self._compose_sequence_node(anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: # <<<<<<<<<<<<<< + * node = self._compose_mapping_node(anchor) + * self.ascend_resolver() + */ + case YAML_MAPPING_START_EVENT: + + /* "_yaml.pyx":776 + * node = self._compose_sequence_node(anchor) + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: + * node = self._compose_mapping_node(anchor) # <<<<<<<<<<<<<< + * self.ascend_resolver() + * return node + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_mapping_node(__pyx_v_self, __pyx_v_anchor); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 776; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_node = __pyx_t_7; + __pyx_t_7 = 0; + break; + default: break; + } + + /* "_yaml.pyx":777 + * elif self.parsed_event.type == YAML_MAPPING_START_EVENT: + * node = self._compose_mapping_node(anchor) + * self.ascend_resolver() # <<<<<<<<<<<<<< + * return node + * + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_ascend_resolver); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":778 + * node = self._compose_mapping_node(anchor) + * self.ascend_resolver() + * return node # <<<<<<<<<<<<<< + * + * cdef _compose_scalar_node(self, object anchor): + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(!__pyx_v_node)) { __Pyx_RaiseUnboundLocalError("node"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } + __Pyx_INCREF(__pyx_v_node); + __pyx_r = __pyx_v_node; + goto __pyx_L0; + + /* "_yaml.pyx":731 + * return node + * + * cdef object _compose_node(self, object parent, object index): # <<<<<<<<<<<<<< + * self._parse_next_event() + * if self.parsed_event.type == YAML_ALIAS_EVENT: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("_yaml.CParser._compose_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_anchor); + __Pyx_XDECREF((PyObject *)__pyx_v_mark); + __Pyx_XDECREF(__pyx_v_node); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":780 + * return node + * + * cdef _compose_scalar_node(self, object anchor): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + +static PyObject *__pyx_f_5_yaml_7CParser__compose_scalar_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_anchor) { + struct __pyx_obj_5_yaml_Mark *__pyx_v_start_mark = NULL; + struct __pyx_obj_5_yaml_Mark *__pyx_v_end_mark = NULL; + PyObject *__pyx_v_value = NULL; + int __pyx_v_plain_implicit; + int __pyx_v_quoted_implicit; + PyObject *__pyx_v_tag = NULL; + PyObject *__pyx_v_style = NULL; + PyObject *__pyx_v_node = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_compose_scalar_node", 0); + + /* "_yaml.pyx":782 + * cdef _compose_scalar_node(self, object anchor): + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":783 + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":784 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * end_mark = Mark(self.stream_name, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":781 + * + * cdef _compose_scalar_node(self, object anchor): + * start_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_start_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":787 + * None, None) + * end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":788 + * end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.column, + * None, None) + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.line); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 788; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + + /* "_yaml.pyx":789 + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, # <<<<<<<<<<<<<< + * None, None) + * value = PyUnicode_DecodeUTF8(self.parsed_event.data.scalar.value, + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.column); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 789; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":786 + * self.parsed_event.start_mark.column, + * None, None) + * end_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + */ + __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_end_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":791 + * self.parsed_event.end_mark.column, + * None, None) + * value = PyUnicode_DecodeUTF8(self.parsed_event.data.scalar.value, # <<<<<<<<<<<<<< + * self.parsed_event.data.scalar.length, 'strict') + * plain_implicit = False + */ + __pyx_t_2 = PyUnicode_DecodeUTF8(__pyx_v_self->parsed_event.data.scalar.value, __pyx_v_self->parsed_event.data.scalar.length, __pyx_k_strict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_value = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":793 + * value = PyUnicode_DecodeUTF8(self.parsed_event.data.scalar.value, + * self.parsed_event.data.scalar.length, 'strict') + * plain_implicit = False # <<<<<<<<<<<<<< + * if self.parsed_event.data.scalar.plain_implicit == 1: + * plain_implicit = True + */ + __pyx_v_plain_implicit = 0; + + /* "_yaml.pyx":794 + * self.parsed_event.data.scalar.length, 'strict') + * plain_implicit = False + * if self.parsed_event.data.scalar.plain_implicit == 1: # <<<<<<<<<<<<<< + * plain_implicit = True + * quoted_implicit = False + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.scalar.plain_implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":795 + * plain_implicit = False + * if self.parsed_event.data.scalar.plain_implicit == 1: + * plain_implicit = True # <<<<<<<<<<<<<< + * quoted_implicit = False + * if self.parsed_event.data.scalar.quoted_implicit == 1: + */ + __pyx_v_plain_implicit = 1; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":796 + * if self.parsed_event.data.scalar.plain_implicit == 1: + * plain_implicit = True + * quoted_implicit = False # <<<<<<<<<<<<<< + * if self.parsed_event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True + */ + __pyx_v_quoted_implicit = 0; + + /* "_yaml.pyx":797 + * plain_implicit = True + * quoted_implicit = False + * if self.parsed_event.data.scalar.quoted_implicit == 1: # <<<<<<<<<<<<<< + * quoted_implicit = True + * if self.parsed_event.data.scalar.tag == NULL \ + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.scalar.quoted_implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":798 + * quoted_implicit = False + * if self.parsed_event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True # <<<<<<<<<<<<<< + * if self.parsed_event.data.scalar.tag == NULL \ + * or (self.parsed_event.data.scalar.tag[0] == c'!' + */ + __pyx_v_quoted_implicit = 1; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":799 + * if self.parsed_event.data.scalar.quoted_implicit == 1: + * quoted_implicit = True + * if self.parsed_event.data.scalar.tag == NULL \ # <<<<<<<<<<<<<< + * or (self.parsed_event.data.scalar.tag[0] == c'!' + * and self.parsed_event.data.scalar.tag[1] == c'\0'): + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.scalar.tag == NULL) != 0); + if (!__pyx_t_5) { + + /* "_yaml.pyx":800 + * quoted_implicit = True + * if self.parsed_event.data.scalar.tag == NULL \ + * or (self.parsed_event.data.scalar.tag[0] == c'!' # <<<<<<<<<<<<<< + * and self.parsed_event.data.scalar.tag[1] == c'\0'): + * tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit)) + */ + __pyx_t_6 = (((__pyx_v_self->parsed_event.data.scalar.tag[0]) == '!') != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":801 + * if self.parsed_event.data.scalar.tag == NULL \ + * or (self.parsed_event.data.scalar.tag[0] == c'!' + * and self.parsed_event.data.scalar.tag[1] == c'\0'): # <<<<<<<<<<<<<< + * tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit)) + * else: + */ + __pyx_t_7 = (((__pyx_v_self->parsed_event.data.scalar.tag[1]) == '\x00') != 0); + __pyx_t_8 = __pyx_t_7; + } else { + __pyx_t_8 = __pyx_t_6; + } + __pyx_t_6 = __pyx_t_8; + } else { + __pyx_t_6 = __pyx_t_5; + } + if (__pyx_t_6) { + + /* "_yaml.pyx":802 + * or (self.parsed_event.data.scalar.tag[0] == c'!' + * and self.parsed_event.data.scalar.tag[1] == c'\0'): + * tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit)) # <<<<<<<<<<<<<< + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyBool_FromLong(__pyx_v_plain_implicit); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_v_quoted_implicit); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __pyx_t_4 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_t_9); + __Pyx_GIVEREF(__pyx_t_9); + __pyx_t_1 = 0; + __pyx_t_9 = 0; + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 802; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_tag = __pyx_t_9; + __pyx_t_9 = 0; + goto __pyx_L5; + } + /*else*/ { + + /* "_yaml.pyx":804 + * tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit)) + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag) # <<<<<<<<<<<<<< + * style = None + * if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + */ + __pyx_t_9 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.scalar.tag); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 804; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __pyx_v_tag = __pyx_t_9; + __pyx_t_9 = 0; + } + __pyx_L5:; + + /* "_yaml.pyx":805 + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag) + * style = None # <<<<<<<<<<<<<< + * if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' + */ + __Pyx_INCREF(Py_None); + __pyx_v_style = Py_None; + + /* "_yaml.pyx":814 + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'>' + * node = ScalarNode(tag, value, start_mark, end_mark, style) + */ + switch (__pyx_v_self->parsed_event.data.scalar.style) { + + /* "_yaml.pyx":806 + * tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag) + * style = None + * if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'' + * elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + */ + case YAML_PLAIN_SCALAR_STYLE: + + /* "_yaml.pyx":807 + * style = None + * if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' # <<<<<<<<<<<<<< + * elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + */ + __Pyx_INCREF(__pyx_kp_u__6); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__6); + break; + + /* "_yaml.pyx":808 + * if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + * style = u'' + * elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'\'' + * elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + */ + case YAML_SINGLE_QUOTED_SCALAR_STYLE: + + /* "_yaml.pyx":809 + * style = u'' + * elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' # <<<<<<<<<<<<<< + * elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + */ + __Pyx_INCREF(__pyx_kp_u__7); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__7); + break; + + /* "_yaml.pyx":810 + * elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + * style = u'\'' + * elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'"' + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + */ + case YAML_DOUBLE_QUOTED_SCALAR_STYLE: + + /* "_yaml.pyx":811 + * style = u'\'' + * elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' # <<<<<<<<<<<<<< + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + */ + __Pyx_INCREF(__pyx_kp_u__8); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__8); + break; + + /* "_yaml.pyx":812 + * elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + * style = u'"' + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'|' + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + */ + case YAML_LITERAL_SCALAR_STYLE: + + /* "_yaml.pyx":813 + * style = u'"' + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' # <<<<<<<<<<<<<< + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + */ + __Pyx_INCREF(__pyx_kp_u__9); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__9); + break; + + /* "_yaml.pyx":814 + * elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + * style = u'|' + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: # <<<<<<<<<<<<<< + * style = u'>' + * node = ScalarNode(tag, value, start_mark, end_mark, style) + */ + case YAML_FOLDED_SCALAR_STYLE: + + /* "_yaml.pyx":815 + * style = u'|' + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' # <<<<<<<<<<<<<< + * node = ScalarNode(tag, value, start_mark, end_mark, style) + * if anchor is not None: + */ + __Pyx_INCREF(__pyx_kp_u__10); + __Pyx_DECREF_SET(__pyx_v_style, __pyx_kp_u__10); + break; + default: break; + } + + /* "_yaml.pyx":816 + * elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + * style = u'>' + * node = ScalarNode(tag, value, start_mark, end_mark, style) # <<<<<<<<<<<<<< + * if anchor is not None: + * self.anchors[anchor] = node + */ + __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_3 = PyTuple_New(5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(((PyObject *)__pyx_v_end_mark)); + PyTuple_SET_ITEM(__pyx_t_3, 3, ((PyObject *)__pyx_v_end_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_end_mark)); + __Pyx_INCREF(__pyx_v_style); + PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_v_style); + __Pyx_GIVEREF(__pyx_v_style); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_node = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":817 + * style = u'>' + * node = ScalarNode(tag, value, start_mark, end_mark, style) + * if anchor is not None: # <<<<<<<<<<<<<< + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_6 = (__pyx_v_anchor != Py_None); + __pyx_t_5 = (__pyx_t_6 != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":818 + * node = ScalarNode(tag, value, start_mark, end_mark, style) + * if anchor is not None: + * self.anchors[anchor] = node # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * return node + */ + if (unlikely(PyObject_SetItem(__pyx_v_self->anchors, __pyx_v_anchor, __pyx_v_node) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":819 + * if anchor is not None: + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * return node + * + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":820 + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + * return node # <<<<<<<<<<<<<< + * + * cdef _compose_sequence_node(self, object anchor): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_node); + __pyx_r = __pyx_v_node; + goto __pyx_L0; + + /* "_yaml.pyx":780 + * return node + * + * cdef _compose_scalar_node(self, object anchor): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("_yaml.CParser._compose_scalar_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_start_mark); + __Pyx_XDECREF((PyObject *)__pyx_v_end_mark); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_tag); + __Pyx_XDECREF(__pyx_v_style); + __Pyx_XDECREF(__pyx_v_node); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":822 + * return node + * + * cdef _compose_sequence_node(self, object anchor): # <<<<<<<<<<<<<< + * cdef int index + * start_mark = Mark(self.stream_name, + */ + +static PyObject *__pyx_f_5_yaml_7CParser__compose_sequence_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_anchor) { + int __pyx_v_index; + struct __pyx_obj_5_yaml_Mark *__pyx_v_start_mark = NULL; + int __pyx_v_implicit; + PyObject *__pyx_v_tag = NULL; + PyObject *__pyx_v_flow_style = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_v_node = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_compose_sequence_node", 0); + + /* "_yaml.pyx":825 + * cdef int index + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":826 + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":827 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * implicit = False + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":824 + * cdef _compose_sequence_node(self, object anchor): + * cdef int index + * start_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_start_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":829 + * self.parsed_event.start_mark.column, + * None, None) + * implicit = False # <<<<<<<<<<<<<< + * if self.parsed_event.data.sequence_start.implicit == 1: + * implicit = True + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":830 + * None, None) + * implicit = False + * if self.parsed_event.data.sequence_start.implicit == 1: # <<<<<<<<<<<<<< + * implicit = True + * if self.parsed_event.data.sequence_start.tag == NULL \ + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.sequence_start.implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":831 + * implicit = False + * if self.parsed_event.data.sequence_start.implicit == 1: + * implicit = True # <<<<<<<<<<<<<< + * if self.parsed_event.data.sequence_start.tag == NULL \ + * or (self.parsed_event.data.sequence_start.tag[0] == c'!' + */ + __pyx_v_implicit = 1; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":832 + * if self.parsed_event.data.sequence_start.implicit == 1: + * implicit = True + * if self.parsed_event.data.sequence_start.tag == NULL \ # <<<<<<<<<<<<<< + * or (self.parsed_event.data.sequence_start.tag[0] == c'!' + * and self.parsed_event.data.sequence_start.tag[1] == c'\0'): + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.sequence_start.tag == NULL) != 0); + if (!__pyx_t_5) { + + /* "_yaml.pyx":833 + * implicit = True + * if self.parsed_event.data.sequence_start.tag == NULL \ + * or (self.parsed_event.data.sequence_start.tag[0] == c'!' # <<<<<<<<<<<<<< + * and self.parsed_event.data.sequence_start.tag[1] == c'\0'): + * tag = self.resolve(SequenceNode, None, implicit) + */ + __pyx_t_6 = (((__pyx_v_self->parsed_event.data.sequence_start.tag[0]) == '!') != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":834 + * if self.parsed_event.data.sequence_start.tag == NULL \ + * or (self.parsed_event.data.sequence_start.tag[0] == c'!' + * and self.parsed_event.data.sequence_start.tag[1] == c'\0'): # <<<<<<<<<<<<<< + * tag = self.resolve(SequenceNode, None, implicit) + * else: + */ + __pyx_t_7 = (((__pyx_v_self->parsed_event.data.sequence_start.tag[1]) == '\x00') != 0); + __pyx_t_8 = __pyx_t_7; + } else { + __pyx_t_8 = __pyx_t_6; + } + __pyx_t_6 = __pyx_t_8; + } else { + __pyx_t_6 = __pyx_t_5; + } + if (__pyx_t_6) { + + /* "_yaml.pyx":835 + * or (self.parsed_event.data.sequence_start.tag[0] == c'!' + * and self.parsed_event.data.sequence_start.tag[1] == c'\0'): + * tag = self.resolve(SequenceNode, None, implicit) # <<<<<<<<<<<<<< + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_implicit); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_4 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_tag = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L4; + } + /*else*/ { + + /* "_yaml.pyx":837 + * tag = self.resolve(SequenceNode, None, implicit) + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag) # <<<<<<<<<<<<<< + * flow_style = None + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.sequence_start.tag); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_tag = __pyx_t_2; + __pyx_t_2 = 0; + } + __pyx_L4:; + + /* "_yaml.pyx":838 + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag) + * flow_style = None # <<<<<<<<<<<<<< + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True + */ + __Pyx_INCREF(Py_None); + __pyx_v_flow_style = Py_None; + + /* "_yaml.pyx":841 + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * value = [] + */ + switch (__pyx_v_self->parsed_event.data.sequence_start.style) { + + /* "_yaml.pyx":839 + * tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag) + * flow_style = None + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: # <<<<<<<<<<<<<< + * flow_style = True + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + */ + case YAML_FLOW_SEQUENCE_STYLE: + + /* "_yaml.pyx":840 + * flow_style = None + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True # <<<<<<<<<<<<<< + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False + */ + __Pyx_INCREF(Py_True); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_True); + break; + + /* "_yaml.pyx":841 + * if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + * flow_style = True + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * value = [] + */ + case YAML_BLOCK_SEQUENCE_STYLE: + + /* "_yaml.pyx":842 + * flow_style = True + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False # <<<<<<<<<<<<<< + * value = [] + * node = SequenceNode(tag, value, start_mark, None, flow_style) + */ + __Pyx_INCREF(Py_False); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_False); + break; + default: break; + } + + /* "_yaml.pyx":843 + * elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + * flow_style = False + * value = [] # <<<<<<<<<<<<<< + * node = SequenceNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_value = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":844 + * flow_style = False + * value = [] + * node = SequenceNode(tag, value, start_mark, None, flow_style) # <<<<<<<<<<<<<< + * if anchor is not None: + * self.anchors[anchor] = node + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 3, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(__pyx_v_flow_style); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_flow_style); + __Pyx_GIVEREF(__pyx_v_flow_style); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_node = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":845 + * value = [] + * node = SequenceNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: # <<<<<<<<<<<<<< + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_6 = (__pyx_v_anchor != Py_None); + __pyx_t_5 = (__pyx_t_6 != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":846 + * node = SequenceNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: + * self.anchors[anchor] = node # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * index = 0 + */ + if (unlikely(PyObject_SetItem(__pyx_v_self->anchors, __pyx_v_anchor, __pyx_v_node) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":847 + * if anchor is not None: + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * index = 0 + * self._parse_next_event() + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":848 + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + * index = 0 # <<<<<<<<<<<<<< + * self._parse_next_event() + * while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: + */ + __pyx_v_index = 0; + + /* "_yaml.pyx":849 + * yaml_event_delete(&self.parsed_event) + * index = 0 + * self._parse_next_event() # <<<<<<<<<<<<<< + * while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: + * value.append(self._compose_node(node, index)) + */ + __pyx_t_9 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_9 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":850 + * index = 0 + * self._parse_next_event() + * while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: # <<<<<<<<<<<<<< + * value.append(self._compose_node(node, index)) + * index = index+1 + */ + while (1) { + __pyx_t_5 = ((__pyx_v_self->parsed_event.type != YAML_SEQUENCE_END_EVENT) != 0); + if (!__pyx_t_5) break; + + /* "_yaml.pyx":851 + * self._parse_next_event() + * while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: + * value.append(self._compose_node(node, index)) # <<<<<<<<<<<<<< + * index = index+1 + * self._parse_next_event() + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_node(__pyx_v_self, __pyx_v_node, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_value, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":852 + * while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: + * value.append(self._compose_node(node, index)) + * index = index+1 # <<<<<<<<<<<<<< + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, + */ + __pyx_v_index = (__pyx_v_index + 1); + + /* "_yaml.pyx":853 + * value.append(self._compose_node(node, index)) + * index = index+1 + * self._parse_next_event() # <<<<<<<<<<<<<< + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, + */ + __pyx_t_9 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_9 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":855 + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":856 + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.column, + * None, None) + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.line); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 856; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":857 + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, # <<<<<<<<<<<<<< + * None, None) + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.column); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":854 + * index = index+1 + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_node, __pyx_n_s_end_mark, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_yaml.pyx":859 + * self.parsed_event.end_mark.column, + * None, None) + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * return node + * + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":860 + * None, None) + * yaml_event_delete(&self.parsed_event) + * return node # <<<<<<<<<<<<<< + * + * cdef _compose_mapping_node(self, object anchor): + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_node); + __pyx_r = __pyx_v_node; + goto __pyx_L0; + + /* "_yaml.pyx":822 + * return node + * + * cdef _compose_sequence_node(self, object anchor): # <<<<<<<<<<<<<< + * cdef int index + * start_mark = Mark(self.stream_name, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.CParser._compose_sequence_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_start_mark); + __Pyx_XDECREF(__pyx_v_tag); + __Pyx_XDECREF(__pyx_v_flow_style); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_node); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":862 + * return node + * + * cdef _compose_mapping_node(self, object anchor): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + +static PyObject *__pyx_f_5_yaml_7CParser__compose_mapping_node(struct __pyx_obj_5_yaml_CParser *__pyx_v_self, PyObject *__pyx_v_anchor) { + struct __pyx_obj_5_yaml_Mark *__pyx_v_start_mark = NULL; + int __pyx_v_implicit; + PyObject *__pyx_v_tag = NULL; + PyObject *__pyx_v_flow_style = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_v_node = NULL; + PyObject *__pyx_v_item_key = NULL; + PyObject *__pyx_v_item_value = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_compose_mapping_node", 0); + + /* "_yaml.pyx":864 + * cdef _compose_mapping_node(self, object anchor): + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 864; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":865 + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.column, + * None, None) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.line); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 865; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":866 + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + * self.parsed_event.start_mark.column, # <<<<<<<<<<<<<< + * None, None) + * implicit = False + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.start_mark.column); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":863 + * + * cdef _compose_mapping_node(self, object anchor): + * start_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.start_mark.index, + * self.parsed_event.start_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_start_mark = ((struct __pyx_obj_5_yaml_Mark *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":868 + * self.parsed_event.start_mark.column, + * None, None) + * implicit = False # <<<<<<<<<<<<<< + * if self.parsed_event.data.mapping_start.implicit == 1: + * implicit = True + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":869 + * None, None) + * implicit = False + * if self.parsed_event.data.mapping_start.implicit == 1: # <<<<<<<<<<<<<< + * implicit = True + * if self.parsed_event.data.mapping_start.tag == NULL \ + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.mapping_start.implicit == 1) != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":870 + * implicit = False + * if self.parsed_event.data.mapping_start.implicit == 1: + * implicit = True # <<<<<<<<<<<<<< + * if self.parsed_event.data.mapping_start.tag == NULL \ + * or (self.parsed_event.data.mapping_start.tag[0] == c'!' + */ + __pyx_v_implicit = 1; + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":871 + * if self.parsed_event.data.mapping_start.implicit == 1: + * implicit = True + * if self.parsed_event.data.mapping_start.tag == NULL \ # <<<<<<<<<<<<<< + * or (self.parsed_event.data.mapping_start.tag[0] == c'!' + * and self.parsed_event.data.mapping_start.tag[1] == c'\0'): + */ + __pyx_t_5 = ((__pyx_v_self->parsed_event.data.mapping_start.tag == NULL) != 0); + if (!__pyx_t_5) { + + /* "_yaml.pyx":872 + * implicit = True + * if self.parsed_event.data.mapping_start.tag == NULL \ + * or (self.parsed_event.data.mapping_start.tag[0] == c'!' # <<<<<<<<<<<<<< + * and self.parsed_event.data.mapping_start.tag[1] == c'\0'): + * tag = self.resolve(MappingNode, None, implicit) + */ + __pyx_t_6 = (((__pyx_v_self->parsed_event.data.mapping_start.tag[0]) == '!') != 0); + if (__pyx_t_6) { + + /* "_yaml.pyx":873 + * if self.parsed_event.data.mapping_start.tag == NULL \ + * or (self.parsed_event.data.mapping_start.tag[0] == c'!' + * and self.parsed_event.data.mapping_start.tag[1] == c'\0'): # <<<<<<<<<<<<<< + * tag = self.resolve(MappingNode, None, implicit) + * else: + */ + __pyx_t_7 = (((__pyx_v_self->parsed_event.data.mapping_start.tag[1]) == '\x00') != 0); + __pyx_t_8 = __pyx_t_7; + } else { + __pyx_t_8 = __pyx_t_6; + } + __pyx_t_6 = __pyx_t_8; + } else { + __pyx_t_6 = __pyx_t_5; + } + if (__pyx_t_6) { + + /* "_yaml.pyx":874 + * or (self.parsed_event.data.mapping_start.tag[0] == c'!' + * and self.parsed_event.data.mapping_start.tag[1] == c'\0'): + * tag = self.resolve(MappingNode, None, implicit) # <<<<<<<<<<<<<< + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingNode); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_implicit); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 1, Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_4 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 874; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_tag = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L4; + } + /*else*/ { + + /* "_yaml.pyx":876 + * tag = self.resolve(MappingNode, None, implicit) + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag) # <<<<<<<<<<<<<< + * flow_style = None + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_self->parsed_event.data.mapping_start.tag); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_tag = __pyx_t_2; + __pyx_t_2 = 0; + } + __pyx_L4:; + + /* "_yaml.pyx":877 + * else: + * tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag) + * flow_style = None # <<<<<<<<<<<<<< + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True + */ + __Pyx_INCREF(Py_None); + __pyx_v_flow_style = Py_None; + + /* "_yaml.pyx":880 + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * value = [] + */ + switch (__pyx_v_self->parsed_event.data.mapping_start.style) { + + /* "_yaml.pyx":878 + * tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag) + * flow_style = None + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: # <<<<<<<<<<<<<< + * flow_style = True + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + */ + case YAML_FLOW_MAPPING_STYLE: + + /* "_yaml.pyx":879 + * flow_style = None + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True # <<<<<<<<<<<<<< + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False + */ + __Pyx_INCREF(Py_True); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_True); + break; + + /* "_yaml.pyx":880 + * if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + * flow_style = True + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: # <<<<<<<<<<<<<< + * flow_style = False + * value = [] + */ + case YAML_BLOCK_MAPPING_STYLE: + + /* "_yaml.pyx":881 + * flow_style = True + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False # <<<<<<<<<<<<<< + * value = [] + * node = MappingNode(tag, value, start_mark, None, flow_style) + */ + __Pyx_INCREF(Py_False); + __Pyx_DECREF_SET(__pyx_v_flow_style, Py_False); + break; + default: break; + } + + /* "_yaml.pyx":882 + * elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + * flow_style = False + * value = [] # <<<<<<<<<<<<<< + * node = MappingNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_value = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":883 + * flow_style = False + * value = [] + * node = MappingNode(tag, value, start_mark, None, flow_style) # <<<<<<<<<<<<<< + * if anchor is not None: + * self.anchors[anchor] = node + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingNode); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_tag); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_tag); + __Pyx_GIVEREF(__pyx_v_tag); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_INCREF(((PyObject *)__pyx_v_start_mark)); + PyTuple_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_v_start_mark)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_start_mark)); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 3, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(__pyx_v_flow_style); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_flow_style); + __Pyx_GIVEREF(__pyx_v_flow_style); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_node = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":884 + * value = [] + * node = MappingNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: # <<<<<<<<<<<<<< + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_6 = (__pyx_v_anchor != Py_None); + __pyx_t_5 = (__pyx_t_6 != 0); + if (__pyx_t_5) { + + /* "_yaml.pyx":885 + * node = MappingNode(tag, value, start_mark, None, flow_style) + * if anchor is not None: + * self.anchors[anchor] = node # <<<<<<<<<<<<<< + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + */ + if (unlikely(PyObject_SetItem(__pyx_v_self->anchors, __pyx_v_anchor, __pyx_v_node) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":886 + * if anchor is not None: + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * self._parse_next_event() + * while self.parsed_event.type != YAML_MAPPING_END_EVENT: + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":887 + * self.anchors[anchor] = node + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() # <<<<<<<<<<<<<< + * while self.parsed_event.type != YAML_MAPPING_END_EVENT: + * item_key = self._compose_node(node, None) + */ + __pyx_t_9 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_9 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":888 + * yaml_event_delete(&self.parsed_event) + * self._parse_next_event() + * while self.parsed_event.type != YAML_MAPPING_END_EVENT: # <<<<<<<<<<<<<< + * item_key = self._compose_node(node, None) + * item_value = self._compose_node(node, item_key) + */ + while (1) { + __pyx_t_5 = ((__pyx_v_self->parsed_event.type != YAML_MAPPING_END_EVENT) != 0); + if (!__pyx_t_5) break; + + /* "_yaml.pyx":889 + * self._parse_next_event() + * while self.parsed_event.type != YAML_MAPPING_END_EVENT: + * item_key = self._compose_node(node, None) # <<<<<<<<<<<<<< + * item_value = self._compose_node(node, item_key) + * value.append((item_key, item_value)) + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_node(__pyx_v_self, __pyx_v_node, Py_None); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_item_key, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":890 + * while self.parsed_event.type != YAML_MAPPING_END_EVENT: + * item_key = self._compose_node(node, None) + * item_value = self._compose_node(node, item_key) # <<<<<<<<<<<<<< + * value.append((item_key, item_value)) + * self._parse_next_event() + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_compose_node(__pyx_v_self, __pyx_v_node, __pyx_v_item_key); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_item_value, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":891 + * item_key = self._compose_node(node, None) + * item_value = self._compose_node(node, item_key) + * value.append((item_key, item_value)) # <<<<<<<<<<<<<< + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_item_key); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_item_key); + __Pyx_GIVEREF(__pyx_v_item_key); + __Pyx_INCREF(__pyx_v_item_value); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_item_value); + __Pyx_GIVEREF(__pyx_v_item_value); + __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_value, __pyx_t_3); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 891; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "_yaml.pyx":892 + * item_value = self._compose_node(node, item_key) + * value.append((item_key, item_value)) + * self._parse_next_event() # <<<<<<<<<<<<<< + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, + */ + __pyx_t_9 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parse_next_event(__pyx_v_self); if (unlikely(__pyx_t_9 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 892; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":894 + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.index); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 894; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + + /* "_yaml.pyx":895 + * node.end_mark = Mark(self.stream_name, + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.column, + * None, None) + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.line); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + + /* "_yaml.pyx":896 + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + * self.parsed_event.end_mark.column, # <<<<<<<<<<<<<< + * None, None) + * yaml_event_delete(&self.parsed_event) + */ + __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_self->parsed_event.end_mark.column); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + + /* "_yaml.pyx":893 + * value.append((item_key, item_value)) + * self._parse_next_event() + * node.end_mark = Mark(self.stream_name, # <<<<<<<<<<<<<< + * self.parsed_event.end_mark.index, + * self.parsed_event.end_mark.line, + */ + __pyx_t_4 = PyTuple_New(6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_INCREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_self->stream_name); + __Pyx_GIVEREF(__pyx_v_self->stream_name); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 4, Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_INCREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_4, 5, Py_None); + __Pyx_GIVEREF(Py_None); + __pyx_t_3 = 0; + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_yaml_Mark)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__Pyx_PyObject_SetAttrStr(__pyx_v_node, __pyx_n_s_end_mark, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "_yaml.pyx":898 + * self.parsed_event.end_mark.column, + * None, None) + * yaml_event_delete(&self.parsed_event) # <<<<<<<<<<<<<< + * return node + * + */ + yaml_event_delete((&__pyx_v_self->parsed_event)); + + /* "_yaml.pyx":899 + * None, None) + * yaml_event_delete(&self.parsed_event) + * return node # <<<<<<<<<<<<<< + * + * cdef int _parse_next_event(self) except 0: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_node); + __pyx_r = __pyx_v_node; + goto __pyx_L0; + + /* "_yaml.pyx":862 + * return node + * + * cdef _compose_mapping_node(self, object anchor): # <<<<<<<<<<<<<< + * start_mark = Mark(self.stream_name, + * self.parsed_event.start_mark.index, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.CParser._compose_mapping_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_start_mark); + __Pyx_XDECREF(__pyx_v_tag); + __Pyx_XDECREF(__pyx_v_flow_style); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XDECREF(__pyx_v_node); + __Pyx_XDECREF(__pyx_v_item_key); + __Pyx_XDECREF(__pyx_v_item_value); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":901 + * return node + * + * cdef int _parse_next_event(self) except 0: # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_NO_EVENT: + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + */ + +static int __pyx_f_5_yaml_7CParser__parse_next_event(struct __pyx_obj_5_yaml_CParser *__pyx_v_self) { + PyObject *__pyx_v_error = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_parse_next_event", 0); + + /* "_yaml.pyx":902 + * + * cdef int _parse_next_event(self) except 0: + * if self.parsed_event.type == YAML_NO_EVENT: # <<<<<<<<<<<<<< + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + * error = self._parser_error() + */ + __pyx_t_1 = ((__pyx_v_self->parsed_event.type == YAML_NO_EVENT) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":903 + * cdef int _parse_next_event(self) except 0: + * if self.parsed_event.type == YAML_NO_EVENT: + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: # <<<<<<<<<<<<<< + * error = self._parser_error() + * raise error + */ + __pyx_t_2 = yaml_parser_parse((&__pyx_v_self->parser), (&__pyx_v_self->parsed_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_2 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":904 + * if self.parsed_event.type == YAML_NO_EVENT: + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + * error = self._parser_error() # <<<<<<<<<<<<<< + * raise error + * return 1 + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CParser *)__pyx_v_self->__pyx_vtab)->_parser_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 904; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":905 + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + * error = self._parser_error() + * raise error # <<<<<<<<<<<<<< + * return 1 + * + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 905; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":906 + * error = self._parser_error() + * raise error + * return 1 # <<<<<<<<<<<<<< + * + * cdef int input_handler(void *data, char *buffer, int size, int *read) except 0: + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":901 + * return node + * + * cdef int _parse_next_event(self) except 0: # <<<<<<<<<<<<<< + * if self.parsed_event.type == YAML_NO_EVENT: + * if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CParser._parse_next_event", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":908 + * return 1 + * + * cdef int input_handler(void *data, char *buffer, int size, int *read) except 0: # <<<<<<<<<<<<<< + * cdef CParser parser + * parser = data + */ + +static int __pyx_f_5_yaml_input_handler(void *__pyx_v_data, char *__pyx_v_buffer, int __pyx_v_size, int *__pyx_v_read) { + struct __pyx_obj_5_yaml_CParser *__pyx_v_parser = 0; + PyObject *__pyx_v_value = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("input_handler", 0); + + /* "_yaml.pyx":910 + * cdef int input_handler(void *data, char *buffer, int size, int *read) except 0: + * cdef CParser parser + * parser = data # <<<<<<<<<<<<<< + * if parser.stream_cache is None: + * value = parser.stream.read(size) + */ + __pyx_t_1 = ((PyObject *)__pyx_v_data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_parser = ((struct __pyx_obj_5_yaml_CParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":911 + * cdef CParser parser + * parser = data + * if parser.stream_cache is None: # <<<<<<<<<<<<<< + * value = parser.stream.read(size) + * if PyUnicode_CheckExact(value) != 0: + */ + __pyx_t_2 = (__pyx_v_parser->stream_cache == Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":912 + * parser = data + * if parser.stream_cache is None: + * value = parser.stream.read(size) # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(value) != 0: + * value = PyUnicode_AsUTF8String(value) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_parser->stream, __pyx_n_s_read); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_size); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_value = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_yaml.pyx":913 + * if parser.stream_cache is None: + * value = parser.stream.read(size) + * if PyUnicode_CheckExact(value) != 0: # <<<<<<<<<<<<<< + * value = PyUnicode_AsUTF8String(value) + * parser.unicode_source = 1 + */ + __pyx_t_3 = ((PyUnicode_CheckExact(__pyx_v_value) != 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":914 + * value = parser.stream.read(size) + * if PyUnicode_CheckExact(value) != 0: + * value = PyUnicode_AsUTF8String(value) # <<<<<<<<<<<<<< + * parser.unicode_source = 1 + * if PyString_CheckExact(value) == 0: + */ + __pyx_t_4 = PyUnicode_AsUTF8String(__pyx_v_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_value, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_yaml.pyx":915 + * if PyUnicode_CheckExact(value) != 0: + * value = PyUnicode_AsUTF8String(value) + * parser.unicode_source = 1 # <<<<<<<<<<<<<< + * if PyString_CheckExact(value) == 0: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_v_parser->unicode_source = 1; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":916 + * value = PyUnicode_AsUTF8String(value) + * parser.unicode_source = 1 + * if PyString_CheckExact(value) == 0: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string value is expected") + */ + __pyx_t_3 = ((PyString_CheckExact(__pyx_v_value) == 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":917 + * parser.unicode_source = 1 + * if PyString_CheckExact(value) == 0: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("a string value is expected") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":918 + * if PyString_CheckExact(value) == 0: + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string value is expected") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"a string value is expected") + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":920 + * raise TypeError("a string value is expected") + * else: + * raise TypeError(u"a string value is expected") # <<<<<<<<<<<<<< + * parser.stream_cache = value + * parser.stream_cache_pos = 0 + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":921 + * else: + * raise TypeError(u"a string value is expected") + * parser.stream_cache = value # <<<<<<<<<<<<<< + * parser.stream_cache_pos = 0 + * parser.stream_cache_len = PyString_GET_SIZE(value) + */ + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __Pyx_GOTREF(__pyx_v_parser->stream_cache); + __Pyx_DECREF(__pyx_v_parser->stream_cache); + __pyx_v_parser->stream_cache = __pyx_v_value; + + /* "_yaml.pyx":922 + * raise TypeError(u"a string value is expected") + * parser.stream_cache = value + * parser.stream_cache_pos = 0 # <<<<<<<<<<<<<< + * parser.stream_cache_len = PyString_GET_SIZE(value) + * if (parser.stream_cache_len - parser.stream_cache_pos) < size: + */ + __pyx_v_parser->stream_cache_pos = 0; + + /* "_yaml.pyx":923 + * parser.stream_cache = value + * parser.stream_cache_pos = 0 + * parser.stream_cache_len = PyString_GET_SIZE(value) # <<<<<<<<<<<<<< + * if (parser.stream_cache_len - parser.stream_cache_pos) < size: + * size = parser.stream_cache_len - parser.stream_cache_pos + */ + __pyx_v_parser->stream_cache_len = PyString_GET_SIZE(__pyx_v_value); + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":924 + * parser.stream_cache_pos = 0 + * parser.stream_cache_len = PyString_GET_SIZE(value) + * if (parser.stream_cache_len - parser.stream_cache_pos) < size: # <<<<<<<<<<<<<< + * size = parser.stream_cache_len - parser.stream_cache_pos + * if size > 0: + */ + __pyx_t_3 = (((__pyx_v_parser->stream_cache_len - __pyx_v_parser->stream_cache_pos) < __pyx_v_size) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":925 + * parser.stream_cache_len = PyString_GET_SIZE(value) + * if (parser.stream_cache_len - parser.stream_cache_pos) < size: + * size = parser.stream_cache_len - parser.stream_cache_pos # <<<<<<<<<<<<<< + * if size > 0: + * memcpy(buffer, PyString_AS_STRING(parser.stream_cache) + */ + __pyx_v_size = (__pyx_v_parser->stream_cache_len - __pyx_v_parser->stream_cache_pos); + goto __pyx_L7; + } + __pyx_L7:; + + /* "_yaml.pyx":926 + * if (parser.stream_cache_len - parser.stream_cache_pos) < size: + * size = parser.stream_cache_len - parser.stream_cache_pos + * if size > 0: # <<<<<<<<<<<<<< + * memcpy(buffer, PyString_AS_STRING(parser.stream_cache) + * + parser.stream_cache_pos, size) + */ + __pyx_t_3 = ((__pyx_v_size > 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":927 + * size = parser.stream_cache_len - parser.stream_cache_pos + * if size > 0: + * memcpy(buffer, PyString_AS_STRING(parser.stream_cache) # <<<<<<<<<<<<<< + * + parser.stream_cache_pos, size) + * read[0] = size + */ + __pyx_t_4 = __pyx_v_parser->stream_cache; + __Pyx_INCREF(__pyx_t_4); + + /* "_yaml.pyx":928 + * if size > 0: + * memcpy(buffer, PyString_AS_STRING(parser.stream_cache) + * + parser.stream_cache_pos, size) # <<<<<<<<<<<<<< + * read[0] = size + * parser.stream_cache_pos += size + */ + memcpy(__pyx_v_buffer, (PyString_AS_STRING(__pyx_t_4) + __pyx_v_parser->stream_cache_pos), __pyx_v_size); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L8; + } + __pyx_L8:; + + /* "_yaml.pyx":929 + * memcpy(buffer, PyString_AS_STRING(parser.stream_cache) + * + parser.stream_cache_pos, size) + * read[0] = size # <<<<<<<<<<<<<< + * parser.stream_cache_pos += size + * if parser.stream_cache_pos == parser.stream_cache_len: + */ + (__pyx_v_read[0]) = __pyx_v_size; + + /* "_yaml.pyx":930 + * + parser.stream_cache_pos, size) + * read[0] = size + * parser.stream_cache_pos += size # <<<<<<<<<<<<<< + * if parser.stream_cache_pos == parser.stream_cache_len: + * parser.stream_cache = None + */ + __pyx_v_parser->stream_cache_pos = (__pyx_v_parser->stream_cache_pos + __pyx_v_size); + + /* "_yaml.pyx":931 + * read[0] = size + * parser.stream_cache_pos += size + * if parser.stream_cache_pos == parser.stream_cache_len: # <<<<<<<<<<<<<< + * parser.stream_cache = None + * return 1 + */ + __pyx_t_3 = ((__pyx_v_parser->stream_cache_pos == __pyx_v_parser->stream_cache_len) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":932 + * parser.stream_cache_pos += size + * if parser.stream_cache_pos == parser.stream_cache_len: + * parser.stream_cache = None # <<<<<<<<<<<<<< + * return 1 + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_parser->stream_cache); + __Pyx_DECREF(__pyx_v_parser->stream_cache); + __pyx_v_parser->stream_cache = Py_None; + goto __pyx_L9; + } + __pyx_L9:; + + /* "_yaml.pyx":933 + * if parser.stream_cache_pos == parser.stream_cache_len: + * parser.stream_cache = None + * return 1 # <<<<<<<<<<<<<< + * + * cdef class CEmitter: + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":908 + * return 1 + * + * cdef int input_handler(void *data, char *buffer, int size, int *read) except 0: # <<<<<<<<<<<<<< + * cdef CParser parser + * parser = data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("_yaml.input_handler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_parser); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":953 + * cdef object use_encoding + * + * def __init__(self, stream, canonical=None, indent=None, width=None, # <<<<<<<<<<<<<< + * allow_unicode=None, line_break=None, encoding=None, + * explicit_start=None, explicit_end=None, version=None, tags=None): + */ + +/* Python wrapper */ +static int __pyx_pw_5_yaml_8CEmitter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_5_yaml_8CEmitter_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_stream = 0; + PyObject *__pyx_v_canonical = 0; + PyObject *__pyx_v_indent = 0; + PyObject *__pyx_v_width = 0; + PyObject *__pyx_v_allow_unicode = 0; + PyObject *__pyx_v_line_break = 0; + PyObject *__pyx_v_encoding = 0; + PyObject *__pyx_v_explicit_start = 0; + PyObject *__pyx_v_explicit_end = 0; + PyObject *__pyx_v_version = 0; + PyObject *__pyx_v_tags = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_stream,&__pyx_n_s_canonical,&__pyx_n_s_indent,&__pyx_n_s_width,&__pyx_n_s_allow_unicode,&__pyx_n_s_line_break,&__pyx_n_s_encoding,&__pyx_n_s_explicit_start,&__pyx_n_s_explicit_end,&__pyx_n_s_version,&__pyx_n_s_tags,0}; + PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; + values[1] = ((PyObject *)Py_None); + values[2] = ((PyObject *)Py_None); + values[3] = ((PyObject *)Py_None); + + /* "_yaml.pyx":954 + * + * def __init__(self, stream, canonical=None, indent=None, width=None, + * allow_unicode=None, line_break=None, encoding=None, # <<<<<<<<<<<<<< + * explicit_start=None, explicit_end=None, version=None, tags=None): + * if yaml_emitter_initialize(&self.emitter) == 0: + */ + values[4] = ((PyObject *)Py_None); + values[5] = ((PyObject *)Py_None); + values[6] = ((PyObject *)Py_None); + + /* "_yaml.pyx":955 + * def __init__(self, stream, canonical=None, indent=None, width=None, + * allow_unicode=None, line_break=None, encoding=None, + * explicit_start=None, explicit_end=None, version=None, tags=None): # <<<<<<<<<<<<<< + * if yaml_emitter_initialize(&self.emitter) == 0: + * raise MemoryError + */ + values[7] = ((PyObject *)Py_None); + values[8] = ((PyObject *)Py_None); + values[9] = ((PyObject *)Py_None); + values[10] = ((PyObject *)Py_None); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_stream)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_canonical); + if (value) { values[1] = value; kw_args--; } + } + case 2: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_indent); + if (value) { values[2] = value; kw_args--; } + } + case 3: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_width); + if (value) { values[3] = value; kw_args--; } + } + case 4: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_allow_unicode); + if (value) { values[4] = value; kw_args--; } + } + case 5: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_line_break); + if (value) { values[5] = value; kw_args--; } + } + case 6: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_encoding); + if (value) { values[6] = value; kw_args--; } + } + case 7: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_explicit_start); + if (value) { values[7] = value; kw_args--; } + } + case 8: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_explicit_end); + if (value) { values[8] = value; kw_args--; } + } + case 9: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_version); + if (value) { values[9] = value; kw_args--; } + } + case 10: + if (kw_args > 0) { + PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_tags); + if (value) { values[10] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_stream = values[0]; + __pyx_v_canonical = values[1]; + __pyx_v_indent = values[2]; + __pyx_v_width = values[3]; + __pyx_v_allow_unicode = values[4]; + __pyx_v_line_break = values[5]; + __pyx_v_encoding = values[6]; + __pyx_v_explicit_start = values[7]; + __pyx_v_explicit_end = values[8]; + __pyx_v_version = values[9]; + __pyx_v_tags = values[10]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 1, 11, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("_yaml.CEmitter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_5_yaml_8CEmitter___init__(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self), __pyx_v_stream, __pyx_v_canonical, __pyx_v_indent, __pyx_v_width, __pyx_v_allow_unicode, __pyx_v_line_break, __pyx_v_encoding, __pyx_v_explicit_start, __pyx_v_explicit_end, __pyx_v_version, __pyx_v_tags); + + /* "_yaml.pyx":953 + * cdef object use_encoding + * + * def __init__(self, stream, canonical=None, indent=None, width=None, # <<<<<<<<<<<<<< + * allow_unicode=None, line_break=None, encoding=None, + * explicit_start=None, explicit_end=None, version=None, tags=None): + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5_yaml_8CEmitter___init__(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_stream, PyObject *__pyx_v_canonical, PyObject *__pyx_v_indent, PyObject *__pyx_v_width, PyObject *__pyx_v_allow_unicode, PyObject *__pyx_v_line_break, PyObject *__pyx_v_encoding, PyObject *__pyx_v_explicit_start, PyObject *__pyx_v_explicit_end, PyObject *__pyx_v_version, PyObject *__pyx_v_tags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "_yaml.pyx":956 + * allow_unicode=None, line_break=None, encoding=None, + * explicit_start=None, explicit_end=None, version=None, tags=None): + * if yaml_emitter_initialize(&self.emitter) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * self.stream = stream + */ + __pyx_t_1 = ((yaml_emitter_initialize((&__pyx_v_self->emitter)) == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":957 + * explicit_start=None, explicit_end=None, version=None, tags=None): + * if yaml_emitter_initialize(&self.emitter) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * self.stream = stream + * self.dump_unicode = 0 + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 957; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":958 + * if yaml_emitter_initialize(&self.emitter) == 0: + * raise MemoryError + * self.stream = stream # <<<<<<<<<<<<<< + * self.dump_unicode = 0 + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_INCREF(__pyx_v_stream); + __Pyx_GIVEREF(__pyx_v_stream); + __Pyx_GOTREF(__pyx_v_self->stream); + __Pyx_DECREF(__pyx_v_self->stream); + __pyx_v_self->stream = __pyx_v_stream; + + /* "_yaml.pyx":959 + * raise MemoryError + * self.stream = stream + * self.dump_unicode = 0 # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * if getattr3(stream, 'encoding', None): + */ + __pyx_v_self->dump_unicode = 0; + + /* "_yaml.pyx":960 + * self.stream = stream + * self.dump_unicode = 0 + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * if getattr3(stream, 'encoding', None): + * self.dump_unicode = 1 + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":961 + * self.dump_unicode = 0 + * if PY_MAJOR_VERSION < 3: + * if getattr3(stream, 'encoding', None): # <<<<<<<<<<<<<< + * self.dump_unicode = 1 + * else: + */ + __pyx_t_2 = __Pyx_GetAttr3(__pyx_v_stream, __pyx_n_s_encoding, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (__pyx_t_1) { + + /* "_yaml.pyx":962 + * if PY_MAJOR_VERSION < 3: + * if getattr3(stream, 'encoding', None): + * self.dump_unicode = 1 # <<<<<<<<<<<<<< + * else: + * if hasattr(stream, u'encoding'): + */ + __pyx_v_self->dump_unicode = 1; + goto __pyx_L5; + } + __pyx_L5:; + goto __pyx_L4; + } + /*else*/ { + + /* "_yaml.pyx":964 + * self.dump_unicode = 1 + * else: + * if hasattr(stream, u'encoding'): # <<<<<<<<<<<<<< + * self.dump_unicode = 1 + * self.use_encoding = encoding + */ + __pyx_t_1 = PyObject_HasAttr(__pyx_v_stream, __pyx_n_u_encoding); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = (__pyx_t_1 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":965 + * else: + * if hasattr(stream, u'encoding'): + * self.dump_unicode = 1 # <<<<<<<<<<<<<< + * self.use_encoding = encoding + * yaml_emitter_set_output(&self.emitter, output_handler, self) + */ + __pyx_v_self->dump_unicode = 1; + goto __pyx_L6; + } + __pyx_L6:; + } + __pyx_L4:; + + /* "_yaml.pyx":966 + * if hasattr(stream, u'encoding'): + * self.dump_unicode = 1 + * self.use_encoding = encoding # <<<<<<<<<<<<<< + * yaml_emitter_set_output(&self.emitter, output_handler, self) + * if canonical: + */ + __Pyx_INCREF(__pyx_v_encoding); + __Pyx_GIVEREF(__pyx_v_encoding); + __Pyx_GOTREF(__pyx_v_self->use_encoding); + __Pyx_DECREF(__pyx_v_self->use_encoding); + __pyx_v_self->use_encoding = __pyx_v_encoding; + + /* "_yaml.pyx":967 + * self.dump_unicode = 1 + * self.use_encoding = encoding + * yaml_emitter_set_output(&self.emitter, output_handler, self) # <<<<<<<<<<<<<< + * if canonical: + * yaml_emitter_set_canonical(&self.emitter, 1) + */ + yaml_emitter_set_output((&__pyx_v_self->emitter), __pyx_f_5_yaml_output_handler, ((void *)__pyx_v_self)); + + /* "_yaml.pyx":968 + * self.use_encoding = encoding + * yaml_emitter_set_output(&self.emitter, output_handler, self) + * if canonical: # <<<<<<<<<<<<<< + * yaml_emitter_set_canonical(&self.emitter, 1) + * if indent is not None: + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_canonical); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_3) { + + /* "_yaml.pyx":969 + * yaml_emitter_set_output(&self.emitter, output_handler, self) + * if canonical: + * yaml_emitter_set_canonical(&self.emitter, 1) # <<<<<<<<<<<<<< + * if indent is not None: + * yaml_emitter_set_indent(&self.emitter, indent) + */ + yaml_emitter_set_canonical((&__pyx_v_self->emitter), 1); + goto __pyx_L7; + } + __pyx_L7:; + + /* "_yaml.pyx":970 + * if canonical: + * yaml_emitter_set_canonical(&self.emitter, 1) + * if indent is not None: # <<<<<<<<<<<<<< + * yaml_emitter_set_indent(&self.emitter, indent) + * if width is not None: + */ + __pyx_t_3 = (__pyx_v_indent != Py_None); + __pyx_t_1 = (__pyx_t_3 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":971 + * yaml_emitter_set_canonical(&self.emitter, 1) + * if indent is not None: + * yaml_emitter_set_indent(&self.emitter, indent) # <<<<<<<<<<<<<< + * if width is not None: + * yaml_emitter_set_width(&self.emitter, width) + */ + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_indent); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 971; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + yaml_emitter_set_indent((&__pyx_v_self->emitter), __pyx_t_4); + goto __pyx_L8; + } + __pyx_L8:; + + /* "_yaml.pyx":972 + * if indent is not None: + * yaml_emitter_set_indent(&self.emitter, indent) + * if width is not None: # <<<<<<<<<<<<<< + * yaml_emitter_set_width(&self.emitter, width) + * if allow_unicode: + */ + __pyx_t_1 = (__pyx_v_width != Py_None); + __pyx_t_3 = (__pyx_t_1 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":973 + * yaml_emitter_set_indent(&self.emitter, indent) + * if width is not None: + * yaml_emitter_set_width(&self.emitter, width) # <<<<<<<<<<<<<< + * if allow_unicode: + * yaml_emitter_set_unicode(&self.emitter, 1) + */ + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_width); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + yaml_emitter_set_width((&__pyx_v_self->emitter), __pyx_t_4); + goto __pyx_L9; + } + __pyx_L9:; + + /* "_yaml.pyx":974 + * if width is not None: + * yaml_emitter_set_width(&self.emitter, width) + * if allow_unicode: # <<<<<<<<<<<<<< + * yaml_emitter_set_unicode(&self.emitter, 1) + * if line_break is not None: + */ + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_allow_unicode); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_3) { + + /* "_yaml.pyx":975 + * yaml_emitter_set_width(&self.emitter, width) + * if allow_unicode: + * yaml_emitter_set_unicode(&self.emitter, 1) # <<<<<<<<<<<<<< + * if line_break is not None: + * if line_break == '\r': + */ + yaml_emitter_set_unicode((&__pyx_v_self->emitter), 1); + goto __pyx_L10; + } + __pyx_L10:; + + /* "_yaml.pyx":976 + * if allow_unicode: + * yaml_emitter_set_unicode(&self.emitter, 1) + * if line_break is not None: # <<<<<<<<<<<<<< + * if line_break == '\r': + * yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) + */ + __pyx_t_3 = (__pyx_v_line_break != Py_None); + __pyx_t_1 = (__pyx_t_3 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":977 + * yaml_emitter_set_unicode(&self.emitter, 1) + * if line_break is not None: + * if line_break == '\r': # <<<<<<<<<<<<<< + * yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) + * elif line_break == '\n': + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_line_break, __pyx_kp_s__17, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":978 + * if line_break is not None: + * if line_break == '\r': + * yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) # <<<<<<<<<<<<<< + * elif line_break == '\n': + * yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) + */ + yaml_emitter_set_break((&__pyx_v_self->emitter), YAML_CR_BREAK); + goto __pyx_L12; + } + + /* "_yaml.pyx":979 + * if line_break == '\r': + * yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) + * elif line_break == '\n': # <<<<<<<<<<<<<< + * yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) + * elif line_break == '\r\n': + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_line_break, __pyx_kp_s__18, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":980 + * yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) + * elif line_break == '\n': + * yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) # <<<<<<<<<<<<<< + * elif line_break == '\r\n': + * yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) + */ + yaml_emitter_set_break((&__pyx_v_self->emitter), YAML_LN_BREAK); + goto __pyx_L12; + } + + /* "_yaml.pyx":981 + * elif line_break == '\n': + * yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) + * elif line_break == '\r\n': # <<<<<<<<<<<<<< + * yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) + * self.document_start_implicit = 1 + */ + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_line_break, __pyx_kp_s__19, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 981; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":982 + * yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) + * elif line_break == '\r\n': + * yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) # <<<<<<<<<<<<<< + * self.document_start_implicit = 1 + * if explicit_start: + */ + yaml_emitter_set_break((&__pyx_v_self->emitter), YAML_CRLN_BREAK); + goto __pyx_L12; + } + __pyx_L12:; + goto __pyx_L11; + } + __pyx_L11:; + + /* "_yaml.pyx":983 + * elif line_break == '\r\n': + * yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) + * self.document_start_implicit = 1 # <<<<<<<<<<<<<< + * if explicit_start: + * self.document_start_implicit = 0 + */ + __pyx_v_self->document_start_implicit = 1; + + /* "_yaml.pyx":984 + * yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) + * self.document_start_implicit = 1 + * if explicit_start: # <<<<<<<<<<<<<< + * self.document_start_implicit = 0 + * self.document_end_implicit = 1 + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_explicit_start); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":985 + * self.document_start_implicit = 1 + * if explicit_start: + * self.document_start_implicit = 0 # <<<<<<<<<<<<<< + * self.document_end_implicit = 1 + * if explicit_end: + */ + __pyx_v_self->document_start_implicit = 0; + goto __pyx_L13; + } + __pyx_L13:; + + /* "_yaml.pyx":986 + * if explicit_start: + * self.document_start_implicit = 0 + * self.document_end_implicit = 1 # <<<<<<<<<<<<<< + * if explicit_end: + * self.document_end_implicit = 0 + */ + __pyx_v_self->document_end_implicit = 1; + + /* "_yaml.pyx":987 + * self.document_start_implicit = 0 + * self.document_end_implicit = 1 + * if explicit_end: # <<<<<<<<<<<<<< + * self.document_end_implicit = 0 + * self.use_version = version + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_explicit_end); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 987; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":988 + * self.document_end_implicit = 1 + * if explicit_end: + * self.document_end_implicit = 0 # <<<<<<<<<<<<<< + * self.use_version = version + * self.use_tags = tags + */ + __pyx_v_self->document_end_implicit = 0; + goto __pyx_L14; + } + __pyx_L14:; + + /* "_yaml.pyx":989 + * if explicit_end: + * self.document_end_implicit = 0 + * self.use_version = version # <<<<<<<<<<<<<< + * self.use_tags = tags + * self.serialized_nodes = {} + */ + __Pyx_INCREF(__pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_GOTREF(__pyx_v_self->use_version); + __Pyx_DECREF(__pyx_v_self->use_version); + __pyx_v_self->use_version = __pyx_v_version; + + /* "_yaml.pyx":990 + * self.document_end_implicit = 0 + * self.use_version = version + * self.use_tags = tags # <<<<<<<<<<<<<< + * self.serialized_nodes = {} + * self.anchors = {} + */ + __Pyx_INCREF(__pyx_v_tags); + __Pyx_GIVEREF(__pyx_v_tags); + __Pyx_GOTREF(__pyx_v_self->use_tags); + __Pyx_DECREF(__pyx_v_self->use_tags); + __pyx_v_self->use_tags = __pyx_v_tags; + + /* "_yaml.pyx":991 + * self.use_version = version + * self.use_tags = tags + * self.serialized_nodes = {} # <<<<<<<<<<<<<< + * self.anchors = {} + * self.last_alias_id = 0 + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 991; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->serialized_nodes); + __Pyx_DECREF(__pyx_v_self->serialized_nodes); + __pyx_v_self->serialized_nodes = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":992 + * self.use_tags = tags + * self.serialized_nodes = {} + * self.anchors = {} # <<<<<<<<<<<<<< + * self.last_alias_id = 0 + * self.closed = -1 + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 992; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->anchors); + __Pyx_DECREF(__pyx_v_self->anchors); + __pyx_v_self->anchors = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":993 + * self.serialized_nodes = {} + * self.anchors = {} + * self.last_alias_id = 0 # <<<<<<<<<<<<<< + * self.closed = -1 + * + */ + __pyx_v_self->last_alias_id = 0; + + /* "_yaml.pyx":994 + * self.anchors = {} + * self.last_alias_id = 0 + * self.closed = -1 # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + __pyx_v_self->closed = -1; + + /* "_yaml.pyx":953 + * cdef object use_encoding + * + * def __init__(self, stream, canonical=None, indent=None, width=None, # <<<<<<<<<<<<<< + * allow_unicode=None, line_break=None, encoding=None, + * explicit_start=None, explicit_end=None, version=None, tags=None): + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("_yaml.CEmitter.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":996 + * self.closed = -1 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * yaml_emitter_delete(&self.emitter) + * + */ + +/* Python wrapper */ +static void __pyx_pw_5_yaml_8CEmitter_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_5_yaml_8CEmitter_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_5_yaml_8CEmitter_2__dealloc__(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5_yaml_8CEmitter_2__dealloc__(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "_yaml.pyx":997 + * + * def __dealloc__(self): + * yaml_emitter_delete(&self.emitter) # <<<<<<<<<<<<<< + * + * def dispose(self): + */ + yaml_emitter_delete((&__pyx_v_self->emitter)); + + /* "_yaml.pyx":996 + * self.closed = -1 + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * yaml_emitter_delete(&self.emitter) + * + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "_yaml.pyx":999 + * yaml_emitter_delete(&self.emitter) + * + * def dispose(self): # <<<<<<<<<<<<<< + * pass + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_8CEmitter_5dispose(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_8CEmitter_5dispose(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("dispose (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_8CEmitter_4dispose(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_8CEmitter_4dispose(CYTHON_UNUSED struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("dispose", 0); + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1002 + * pass + * + * cdef object _emitter_error(self): # <<<<<<<<<<<<<< + * if self.emitter.error == YAML_MEMORY_ERROR: + * return MemoryError + */ + +static PyObject *__pyx_f_5_yaml_8CEmitter__emitter_error(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self) { + PyObject *__pyx_v_problem = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_emitter_error", 0); + + /* "_yaml.pyx":1005 + * if self.emitter.error == YAML_MEMORY_ERROR: + * return MemoryError + * elif self.emitter.error == YAML_EMITTER_ERROR: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * problem = self.emitter.problem + */ + switch (__pyx_v_self->emitter.error) { + + /* "_yaml.pyx":1003 + * + * cdef object _emitter_error(self): + * if self.emitter.error == YAML_MEMORY_ERROR: # <<<<<<<<<<<<<< + * return MemoryError + * elif self.emitter.error == YAML_EMITTER_ERROR: + */ + case YAML_MEMORY_ERROR: + + /* "_yaml.pyx":1004 + * cdef object _emitter_error(self): + * if self.emitter.error == YAML_MEMORY_ERROR: + * return MemoryError # <<<<<<<<<<<<<< + * elif self.emitter.error == YAML_EMITTER_ERROR: + * if PY_MAJOR_VERSION < 3: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_builtin_MemoryError); + __pyx_r = __pyx_builtin_MemoryError; + goto __pyx_L0; + break; + + /* "_yaml.pyx":1005 + * if self.emitter.error == YAML_MEMORY_ERROR: + * return MemoryError + * elif self.emitter.error == YAML_EMITTER_ERROR: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * problem = self.emitter.problem + */ + case YAML_EMITTER_ERROR: + + /* "_yaml.pyx":1006 + * return MemoryError + * elif self.emitter.error == YAML_EMITTER_ERROR: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * problem = self.emitter.problem + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1007 + * elif self.emitter.error == YAML_EMITTER_ERROR: + * if PY_MAJOR_VERSION < 3: + * problem = self.emitter.problem # <<<<<<<<<<<<<< + * else: + * problem = PyUnicode_FromString(self.emitter.problem) + */ + __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_self->emitter.problem); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_problem = __pyx_t_2; + __pyx_t_2 = 0; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":1009 + * problem = self.emitter.problem + * else: + * problem = PyUnicode_FromString(self.emitter.problem) # <<<<<<<<<<<<<< + * return EmitterError(problem) + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_2 = PyUnicode_FromString(__pyx_v_self->emitter.problem); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_problem = __pyx_t_2; + __pyx_t_2 = 0; + } + __pyx_L3:; + + /* "_yaml.pyx":1010 + * else: + * problem = PyUnicode_FromString(self.emitter.problem) + * return EmitterError(problem) # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no emitter error") + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_EmitterError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_problem); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_problem); + __Pyx_GIVEREF(__pyx_v_problem); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + break; + default: break; + } + + /* "_yaml.pyx":1011 + * problem = PyUnicode_FromString(self.emitter.problem) + * return EmitterError(problem) + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("no emitter error") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1012 + * return EmitterError(problem) + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no emitter error") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"no emitter error") + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1014 + * raise ValueError("no emitter error") + * else: + * raise ValueError(u"no emitter error") # <<<<<<<<<<<<<< + * + * cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0: + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1002 + * pass + * + * cdef object _emitter_error(self): # <<<<<<<<<<<<<< + * if self.emitter.error == YAML_MEMORY_ERROR: + * return MemoryError + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.CEmitter._emitter_error", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_problem); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1016 + * raise ValueError(u"no emitter error") + * + * cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0: # <<<<<<<<<<<<<< + * cdef yaml_encoding_t encoding + * cdef yaml_version_directive_t version_directive_value + */ + +static int __pyx_f_5_yaml_8CEmitter__object_to_event(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_event_object, yaml_event_t *__pyx_v_event) { + yaml_encoding_t __pyx_v_encoding; + yaml_version_directive_t __pyx_v_version_directive_value; + yaml_version_directive_t *__pyx_v_version_directive; + yaml_tag_directive_t __pyx_v_tag_directives_value[128]; + yaml_tag_directive_t *__pyx_v_tag_directives_start; + yaml_tag_directive_t *__pyx_v_tag_directives_end; + int __pyx_v_implicit; + int __pyx_v_plain_implicit; + int __pyx_v_quoted_implicit; + char *__pyx_v_anchor; + char *__pyx_v_tag; + char *__pyx_v_value; + int __pyx_v_length; + yaml_scalar_style_t __pyx_v_scalar_style; + yaml_sequence_style_t __pyx_v_sequence_style; + yaml_mapping_style_t __pyx_v_mapping_style; + PyObject *__pyx_v_event_class = NULL; + PyObject *__pyx_v_cache = NULL; + PyObject *__pyx_v_handle = NULL; + PyObject *__pyx_v_prefix = NULL; + PyObject *__pyx_v_anchor_object = NULL; + PyObject *__pyx_v_tag_object = NULL; + PyObject *__pyx_v_value_object = NULL; + PyObject *__pyx_v_style_object = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + PyObject *(*__pyx_t_8)(PyObject *); + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_object_to_event", 0); + + /* "_yaml.pyx":1033 + * cdef yaml_sequence_style_t sequence_style + * cdef yaml_mapping_style_t mapping_style + * event_class = event_object.__class__ # <<<<<<<<<<<<<< + * if event_class is StreamStartEvent: + * encoding = YAML_UTF8_ENCODING + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_class); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_event_class = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":1034 + * cdef yaml_mapping_style_t mapping_style + * event_class = event_object.__class__ + * if event_class is StreamStartEvent: # <<<<<<<<<<<<<< + * encoding = YAML_UTF8_ENCODING + * if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__pyx_v_event_class == __pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1035 + * event_class = event_object.__class__ + * if event_class is StreamStartEvent: + * encoding = YAML_UTF8_ENCODING # <<<<<<<<<<<<<< + * if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING + */ + __pyx_v_encoding = YAML_UTF8_ENCODING; + + /* "_yaml.pyx":1036 + * if event_class is StreamStartEvent: + * encoding = YAML_UTF8_ENCODING + * if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': # <<<<<<<<<<<<<< + * encoding = YAML_UTF16LE_ENCODING + * elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_encoding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_kp_u_utf_16_le, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_3) { + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_encoding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_kp_s_utf_16_le, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = __pyx_t_2; + } else { + __pyx_t_4 = __pyx_t_3; + } + if (__pyx_t_4) { + + /* "_yaml.pyx":1037 + * encoding = YAML_UTF8_ENCODING + * if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING # <<<<<<<<<<<<<< + * elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': + * encoding = YAML_UTF16BE_ENCODING + */ + __pyx_v_encoding = YAML_UTF16LE_ENCODING; + goto __pyx_L4; + } + + /* "_yaml.pyx":1038 + * if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING + * elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': # <<<<<<<<<<<<<< + * encoding = YAML_UTF16BE_ENCODING + * if event_object.encoding is None: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_encoding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_kp_u_utf_16_be, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (!__pyx_t_4) { + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_encoding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_t_1, __pyx_kp_s_utf_16_be, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = __pyx_t_3; + } else { + __pyx_t_2 = __pyx_t_4; + } + if (__pyx_t_2) { + + /* "_yaml.pyx":1039 + * encoding = YAML_UTF16LE_ENCODING + * elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': + * encoding = YAML_UTF16BE_ENCODING # <<<<<<<<<<<<<< + * if event_object.encoding is None: + * self.dump_unicode = 1 + */ + __pyx_v_encoding = YAML_UTF16BE_ENCODING; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":1040 + * elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': + * encoding = YAML_UTF16BE_ENCODING + * if event_object.encoding is None: # <<<<<<<<<<<<<< + * self.dump_unicode = 1 + * if self.dump_unicode == 1: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_encoding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__pyx_t_1 == Py_None); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1041 + * encoding = YAML_UTF16BE_ENCODING + * if event_object.encoding is None: + * self.dump_unicode = 1 # <<<<<<<<<<<<<< + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING + */ + __pyx_v_self->dump_unicode = 1; + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":1042 + * if event_object.encoding is None: + * self.dump_unicode = 1 + * if self.dump_unicode == 1: # <<<<<<<<<<<<<< + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(event, encoding) + */ + __pyx_t_4 = ((__pyx_v_self->dump_unicode == 1) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1043 + * self.dump_unicode = 1 + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING # <<<<<<<<<<<<<< + * yaml_stream_start_event_initialize(event, encoding) + * elif event_class is StreamEndEvent: + */ + __pyx_v_encoding = YAML_UTF8_ENCODING; + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":1044 + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(event, encoding) # <<<<<<<<<<<<<< + * elif event_class is StreamEndEvent: + * yaml_stream_end_event_initialize(event) + */ + yaml_stream_start_event_initialize(__pyx_v_event, __pyx_v_encoding); + goto __pyx_L3; + } + + /* "_yaml.pyx":1045 + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(event, encoding) + * elif event_class is StreamEndEvent: # <<<<<<<<<<<<<< + * yaml_stream_end_event_initialize(event) + * elif event_class is DocumentStartEvent: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StreamEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1045; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = (__pyx_v_event_class == __pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_2 = (__pyx_t_4 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1046 + * yaml_stream_start_event_initialize(event, encoding) + * elif event_class is StreamEndEvent: + * yaml_stream_end_event_initialize(event) # <<<<<<<<<<<<<< + * elif event_class is DocumentStartEvent: + * version_directive = NULL + */ + yaml_stream_end_event_initialize(__pyx_v_event); + goto __pyx_L3; + } + + /* "_yaml.pyx":1047 + * elif event_class is StreamEndEvent: + * yaml_stream_end_event_initialize(event) + * elif event_class is DocumentStartEvent: # <<<<<<<<<<<<<< + * version_directive = NULL + * if event_object.version: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1047; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = (__pyx_v_event_class == __pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1048 + * yaml_stream_end_event_initialize(event) + * elif event_class is DocumentStartEvent: + * version_directive = NULL # <<<<<<<<<<<<<< + * if event_object.version: + * version_directive_value.major = event_object.version[0] + */ + __pyx_v_version_directive = NULL; + + /* "_yaml.pyx":1049 + * elif event_class is DocumentStartEvent: + * version_directive = NULL + * if event_object.version: # <<<<<<<<<<<<<< + * version_directive_value.major = event_object.version[0] + * version_directive_value.minor = event_object.version[1] + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_4) { + + /* "_yaml.pyx":1050 + * version_directive = NULL + * if event_object.version: + * version_directive_value.major = event_object.version[0] # <<<<<<<<<<<<<< + * version_directive_value.minor = event_object.version[1] + * version_directive = &version_directive_value + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_version); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_1, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_version_directive_value.major = __pyx_t_6; + + /* "_yaml.pyx":1051 + * if event_object.version: + * version_directive_value.major = event_object.version[0] + * version_directive_value.minor = event_object.version[1] # <<<<<<<<<<<<<< + * version_directive = &version_directive_value + * tag_directives_start = NULL + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_version); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_5, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_version_directive_value.minor = __pyx_t_6; + + /* "_yaml.pyx":1052 + * version_directive_value.major = event_object.version[0] + * version_directive_value.minor = event_object.version[1] + * version_directive = &version_directive_value # <<<<<<<<<<<<<< + * tag_directives_start = NULL + * tag_directives_end = NULL + */ + __pyx_v_version_directive = (&__pyx_v_version_directive_value); + goto __pyx_L7; + } + __pyx_L7:; + + /* "_yaml.pyx":1053 + * version_directive_value.minor = event_object.version[1] + * version_directive = &version_directive_value + * tag_directives_start = NULL # <<<<<<<<<<<<<< + * tag_directives_end = NULL + * if event_object.tags: + */ + __pyx_v_tag_directives_start = NULL; + + /* "_yaml.pyx":1054 + * version_directive = &version_directive_value + * tag_directives_start = NULL + * tag_directives_end = NULL # <<<<<<<<<<<<<< + * if event_object.tags: + * if len(event_object.tags) > 128: + */ + __pyx_v_tag_directives_end = NULL; + + /* "_yaml.pyx":1055 + * tag_directives_start = NULL + * tag_directives_end = NULL + * if event_object.tags: # <<<<<<<<<<<<<< + * if len(event_object.tags) > 128: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_4) { + + /* "_yaml.pyx":1056 + * tag_directives_end = NULL + * if event_object.tags: + * if len(event_object.tags) > 128: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_4 = ((__pyx_t_7 > 128) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1057 + * if event_object.tags: + * if len(event_object.tags) > 128: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("too many tags") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1058 + * if len(event_object.tags) > 128: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"too many tags") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1060 + * raise ValueError("too many tags") + * else: + * raise ValueError(u"too many tags") # <<<<<<<<<<<<<< + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1060; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1060; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1061 + * else: + * raise ValueError(u"too many tags") + * tag_directives_start = tag_directives_value # <<<<<<<<<<<<<< + * tag_directives_end = tag_directives_value + * cache = [] + */ + __pyx_v_tag_directives_start = __pyx_v_tag_directives_value; + + /* "_yaml.pyx":1062 + * raise ValueError(u"too many tags") + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value # <<<<<<<<<<<<<< + * cache = [] + * for handle in event_object.tags: + */ + __pyx_v_tag_directives_end = __pyx_v_tag_directives_value; + + /* "_yaml.pyx":1063 + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + * cache = [] # <<<<<<<<<<<<<< + * for handle in event_object.tags: + * prefix = event_object.tags[handle] + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1063; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cache = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":1064 + * tag_directives_end = tag_directives_value + * cache = [] + * for handle in event_object.tags: # <<<<<<<<<<<<<< + * prefix = event_object.tags[handle] + * if PyUnicode_CheckExact(handle): + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) { + __pyx_t_5 = __pyx_t_1; __Pyx_INCREF(__pyx_t_5); __pyx_t_7 = 0; + __pyx_t_8 = NULL; + } else { + __pyx_t_7 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = Py_TYPE(__pyx_t_5)->tp_iternext; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (!__pyx_t_8 && PyList_CheckExact(__pyx_t_5)) { + if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_8 && PyTuple_CheckExact(__pyx_t_5)) { + if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_1 = __pyx_t_8(__pyx_t_5); + if (unlikely(!__pyx_t_1)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_handle, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":1065 + * cache = [] + * for handle in event_object.tags: + * prefix = event_object.tags[handle] # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tags); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_9 = PyObject_GetItem(__pyx_t_1, __pyx_v_handle); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF_SET(__pyx_v_prefix, __pyx_t_9); + __pyx_t_9 = 0; + + /* "_yaml.pyx":1066 + * for handle in event_object.tags: + * prefix = event_object.tags[handle] + * if PyUnicode_CheckExact(handle): # <<<<<<<<<<<<<< + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_handle) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1067 + * prefix = event_object.tags[handle] + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) # <<<<<<<<<<<<<< + * cache.append(handle) + * if not PyString_CheckExact(handle): + */ + __pyx_t_9 = PyUnicode_AsUTF8String(__pyx_v_handle); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1067; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF_SET(__pyx_v_handle, __pyx_t_9); + __pyx_t_9 = 0; + + /* "_yaml.pyx":1068 + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_cache, __pyx_v_handle); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L13; + } + __pyx_L13:; + + /* "_yaml.pyx":1069 + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) + * if not PyString_CheckExact(handle): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_handle) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1070 + * cache.append(handle) + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag handle must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1071 + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag handle must be a string") + */ + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_Raise(__pyx_t_9, 0, 0, 0); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1073 + * raise TypeError("tag handle must be a string") + * else: + * raise TypeError(u"tag handle must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + */ + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__25, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_Raise(__pyx_t_9, 0, 0, 0); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1074 + * else: + * raise TypeError(u"tag handle must be a string") + * tag_directives_end.handle = PyString_AS_STRING(handle) # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) + */ + __pyx_v_tag_directives_end->handle = PyString_AS_STRING(__pyx_v_handle); + + /* "_yaml.pyx":1075 + * raise TypeError(u"tag handle must be a string") + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): # <<<<<<<<<<<<<< + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_prefix) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1076 + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) # <<<<<<<<<<<<<< + * cache.append(prefix) + * if not PyString_CheckExact(prefix): + */ + __pyx_t_9 = PyUnicode_AsUTF8String(__pyx_v_prefix); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF_SET(__pyx_v_prefix, __pyx_t_9); + __pyx_t_9 = 0; + + /* "_yaml.pyx":1077 + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_cache, __pyx_v_prefix); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L16; + } + __pyx_L16:; + + /* "_yaml.pyx":1078 + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) + * if not PyString_CheckExact(prefix): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_prefix) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1079 + * cache.append(prefix) + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag prefix must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1080 + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag prefix must be a string") + */ + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__26, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_Raise(__pyx_t_9, 0, 0, 0); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1082 + * raise TypeError("tag prefix must be a string") + * else: + * raise TypeError(u"tag prefix must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 + */ + __pyx_t_9 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__27, NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __Pyx_Raise(__pyx_t_9, 0, 0, 0); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1083 + * else: + * raise TypeError(u"tag prefix must be a string") + * tag_directives_end.prefix = PyString_AS_STRING(prefix) # <<<<<<<<<<<<<< + * tag_directives_end = tag_directives_end+1 + * implicit = 1 + */ + __pyx_v_tag_directives_end->prefix = PyString_AS_STRING(__pyx_v_prefix); + + /* "_yaml.pyx":1084 + * raise TypeError(u"tag prefix must be a string") + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 # <<<<<<<<<<<<<< + * implicit = 1 + * if event_object.explicit: + */ + __pyx_v_tag_directives_end = (__pyx_v_tag_directives_end + 1); + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + goto __pyx_L8; + } + __pyx_L8:; + + /* "_yaml.pyx":1085 + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 + * implicit = 1 # <<<<<<<<<<<<<< + * if event_object.explicit: + * implicit = 0 + */ + __pyx_v_implicit = 1; + + /* "_yaml.pyx":1086 + * tag_directives_end = tag_directives_end+1 + * implicit = 1 + * if event_object.explicit: # <<<<<<<<<<<<<< + * implicit = 0 + * if yaml_document_start_event_initialize(event, version_directive, + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_explicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_4) { + + /* "_yaml.pyx":1087 + * implicit = 1 + * if event_object.explicit: + * implicit = 0 # <<<<<<<<<<<<<< + * if yaml_document_start_event_initialize(event, version_directive, + * tag_directives_start, tag_directives_end, implicit) == 0: + */ + __pyx_v_implicit = 0; + goto __pyx_L19; + } + __pyx_L19:; + + /* "_yaml.pyx":1089 + * implicit = 0 + * if yaml_document_start_event_initialize(event, version_directive, + * tag_directives_start, tag_directives_end, implicit) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * elif event_class is DocumentEndEvent: + */ + __pyx_t_4 = ((yaml_document_start_event_initialize(__pyx_v_event, __pyx_v_version_directive, __pyx_v_tag_directives_start, __pyx_v_tag_directives_end, __pyx_v_implicit) == 0) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1090 + * if yaml_document_start_event_initialize(event, version_directive, + * tag_directives_start, tag_directives_end, implicit) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * elif event_class is DocumentEndEvent: + * implicit = 1 + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1090; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + + /* "_yaml.pyx":1091 + * tag_directives_start, tag_directives_end, implicit) == 0: + * raise MemoryError + * elif event_class is DocumentEndEvent: # <<<<<<<<<<<<<< + * implicit = 1 + * if event_object.explicit: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DocumentEndEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = (__pyx_t_4 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1092 + * raise MemoryError + * elif event_class is DocumentEndEvent: + * implicit = 1 # <<<<<<<<<<<<<< + * if event_object.explicit: + * implicit = 0 + */ + __pyx_v_implicit = 1; + + /* "_yaml.pyx":1093 + * elif event_class is DocumentEndEvent: + * implicit = 1 + * if event_object.explicit: # <<<<<<<<<<<<<< + * implicit = 0 + * yaml_document_end_event_initialize(event, implicit) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_explicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1093; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_2) { + + /* "_yaml.pyx":1094 + * implicit = 1 + * if event_object.explicit: + * implicit = 0 # <<<<<<<<<<<<<< + * yaml_document_end_event_initialize(event, implicit) + * elif event_class is AliasEvent: + */ + __pyx_v_implicit = 0; + goto __pyx_L21; + } + __pyx_L21:; + + /* "_yaml.pyx":1095 + * if event_object.explicit: + * implicit = 0 + * yaml_document_end_event_initialize(event, implicit) # <<<<<<<<<<<<<< + * elif event_class is AliasEvent: + * anchor = NULL + */ + yaml_document_end_event_initialize(__pyx_v_event, __pyx_v_implicit); + goto __pyx_L3; + } + + /* "_yaml.pyx":1096 + * implicit = 0 + * yaml_document_end_event_initialize(event, implicit) + * elif event_class is AliasEvent: # <<<<<<<<<<<<<< + * anchor = NULL + * anchor_object = event_object.anchor + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_AliasEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1097 + * yaml_document_end_event_initialize(event, implicit) + * elif event_class is AliasEvent: + * anchor = NULL # <<<<<<<<<<<<<< + * anchor_object = event_object.anchor + * if PyUnicode_CheckExact(anchor_object): + */ + __pyx_v_anchor = NULL; + + /* "_yaml.pyx":1098 + * elif event_class is AliasEvent: + * anchor = NULL + * anchor_object = event_object.anchor # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_anchor); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_anchor_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1099 + * anchor = NULL + * anchor_object = event_object.anchor + * if PyUnicode_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_anchor_object) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1100 + * anchor_object = event_object.anchor + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_anchor_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_anchor_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L22; + } + __pyx_L22:; + + /* "_yaml.pyx":1101 + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_anchor_object) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1102 + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("anchor must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1103 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__28, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1105 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * if yaml_alias_event_initialize(event, anchor) == 0: + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__29, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1106 + * else: + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) # <<<<<<<<<<<<<< + * if yaml_alias_event_initialize(event, anchor) == 0: + * raise MemoryError + */ + __pyx_v_anchor = PyString_AS_STRING(__pyx_v_anchor_object); + + /* "_yaml.pyx":1107 + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) + * if yaml_alias_event_initialize(event, anchor) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * elif event_class is ScalarEvent: + */ + __pyx_t_4 = ((yaml_alias_event_initialize(__pyx_v_event, __pyx_v_anchor) == 0) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1108 + * anchor = PyString_AS_STRING(anchor_object) + * if yaml_alias_event_initialize(event, anchor) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * elif event_class is ScalarEvent: + * anchor = NULL + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + + /* "_yaml.pyx":1109 + * if yaml_alias_event_initialize(event, anchor) == 0: + * raise MemoryError + * elif event_class is ScalarEvent: # <<<<<<<<<<<<<< + * anchor = NULL + * anchor_object = event_object.anchor + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = (__pyx_t_4 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1110 + * raise MemoryError + * elif event_class is ScalarEvent: + * anchor = NULL # <<<<<<<<<<<<<< + * anchor_object = event_object.anchor + * if anchor_object is not None: + */ + __pyx_v_anchor = NULL; + + /* "_yaml.pyx":1111 + * elif event_class is ScalarEvent: + * anchor = NULL + * anchor_object = event_object.anchor # <<<<<<<<<<<<<< + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_anchor); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_anchor_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1112 + * anchor = NULL + * anchor_object = event_object.anchor + * if anchor_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + */ + __pyx_t_2 = (__pyx_v_anchor_object != Py_None); + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1113 + * anchor_object = event_object.anchor + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_anchor_object) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1114 + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_anchor_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_anchor_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L27; + } + __pyx_L27:; + + /* "_yaml.pyx":1115 + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_anchor_object) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1116 + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("anchor must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1117 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__30, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1119 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__31, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1120 + * else: + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) # <<<<<<<<<<<<<< + * tag = NULL + * tag_object = event_object.tag + */ + __pyx_v_anchor = PyString_AS_STRING(__pyx_v_anchor_object); + goto __pyx_L26; + } + __pyx_L26:; + + /* "_yaml.pyx":1121 + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL # <<<<<<<<<<<<<< + * tag_object = event_object.tag + * if tag_object is not None: + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1122 + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + * tag_object = event_object.tag # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tag); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_tag_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1123 + * tag = NULL + * tag_object = event_object.tag + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_4 = (__pyx_v_tag_object != Py_None); + __pyx_t_2 = (__pyx_t_4 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1124 + * tag_object = event_object.tag + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_2 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1125 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L31; + } + __pyx_L31:; + + /* "_yaml.pyx":1126 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_2 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1127 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_2 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1128 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__32, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1130 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * value_object = event_object.value + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__33, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1131 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * value_object = event_object.value + * if PyUnicode_CheckExact(value_object): + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L30; + } + __pyx_L30:; + + /* "_yaml.pyx":1132 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * value_object = event_object.value # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_value); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_value_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1133 + * tag = PyString_AS_STRING(tag_object) + * value_object = event_object.value + * if PyUnicode_CheckExact(value_object): # <<<<<<<<<<<<<< + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): + */ + __pyx_t_2 = (PyUnicode_CheckExact(__pyx_v_value_object) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1134 + * value_object = event_object.value + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_value_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_value_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L34; + } + __pyx_L34:; + + /* "_yaml.pyx":1135 + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") + */ + __pyx_t_2 = ((!(PyString_CheckExact(__pyx_v_value_object) != 0)) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1136 + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("value must be a string") + * else: + */ + __pyx_t_2 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1137 + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"value must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__34, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1139 + * raise TypeError("value must be a string") + * else: + * raise TypeError(u"value must be a string") # <<<<<<<<<<<<<< + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__35, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1140 + * else: + * raise TypeError(u"value must be a string") + * value = PyString_AS_STRING(value_object) # <<<<<<<<<<<<<< + * length = PyString_GET_SIZE(value_object) + * plain_implicit = 0 + */ + __pyx_v_value = PyString_AS_STRING(__pyx_v_value_object); + + /* "_yaml.pyx":1141 + * raise TypeError(u"value must be a string") + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) # <<<<<<<<<<<<<< + * plain_implicit = 0 + * quoted_implicit = 0 + */ + __pyx_v_length = PyString_GET_SIZE(__pyx_v_value_object); + + /* "_yaml.pyx":1142 + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + * plain_implicit = 0 # <<<<<<<<<<<<<< + * quoted_implicit = 0 + * if event_object.implicit is not None: + */ + __pyx_v_plain_implicit = 0; + + /* "_yaml.pyx":1143 + * length = PyString_GET_SIZE(value_object) + * plain_implicit = 0 + * quoted_implicit = 0 # <<<<<<<<<<<<<< + * if event_object.implicit is not None: + * plain_implicit = event_object.implicit[0] + */ + __pyx_v_quoted_implicit = 0; + + /* "_yaml.pyx":1144 + * plain_implicit = 0 + * quoted_implicit = 0 + * if event_object.implicit is not None: # <<<<<<<<<<<<<< + * plain_implicit = event_object.implicit[0] + * quoted_implicit = event_object.implicit[1] + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_implicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_2 = (__pyx_t_5 != Py_None); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = (__pyx_t_2 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1145 + * quoted_implicit = 0 + * if event_object.implicit is not None: + * plain_implicit = event_object.implicit[0] # <<<<<<<<<<<<<< + * quoted_implicit = event_object.implicit[1] + * style_object = event_object.style + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_implicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = __Pyx_GetItemInt(__pyx_t_5, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_9); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_v_plain_implicit = __pyx_t_6; + + /* "_yaml.pyx":1146 + * if event_object.implicit is not None: + * plain_implicit = event_object.implicit[0] + * quoted_implicit = event_object.implicit[1] # <<<<<<<<<<<<<< + * style_object = event_object.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE + */ + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_implicit); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_9, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_5 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_t_5); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_v_quoted_implicit = __pyx_t_6; + goto __pyx_L37; + } + __pyx_L37:; + + /* "_yaml.pyx":1147 + * plain_implicit = event_object.implicit[0] + * quoted_implicit = event_object.implicit[1] + * style_object = event_object.style # <<<<<<<<<<<<<< + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_style); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_style_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1148 + * quoted_implicit = event_object.implicit[1] + * style_object = event_object.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE # <<<<<<<<<<<<<< + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_PLAIN_SCALAR_STYLE; + + /* "_yaml.pyx":1149 + * style_object = event_object.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": # <<<<<<<<<<<<<< + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__7, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_4) { + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__7, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __pyx_t_2; + } else { + __pyx_t_3 = __pyx_t_4; + } + if (__pyx_t_3) { + + /* "_yaml.pyx":1150 + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE; + goto __pyx_L38; + } + + /* "_yaml.pyx":1151 + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": # <<<<<<<<<<<<<< + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__8, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_3) { + __pyx_t_4 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__8, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __pyx_t_4; + } else { + __pyx_t_2 = __pyx_t_3; + } + if (__pyx_t_2) { + + /* "_yaml.pyx":1152 + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE; + goto __pyx_L38; + } + + /* "_yaml.pyx":1153 + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": # <<<<<<<<<<<<<< + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": + */ + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__9, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_2) { + __pyx_t_3 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__9, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_4 = __pyx_t_3; + } else { + __pyx_t_4 = __pyx_t_2; + } + if (__pyx_t_4) { + + /* "_yaml.pyx":1154 + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == ">" or style_object == u">": + * scalar_style = YAML_FOLDED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_LITERAL_SCALAR_STYLE; + goto __pyx_L38; + } + + /* "_yaml.pyx":1155 + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": # <<<<<<<<<<<<<< + * scalar_style = YAML_FOLDED_SCALAR_STYLE + * if yaml_scalar_event_initialize(event, anchor, tag, value, length, + */ + __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__10, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_4) { + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__10, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __pyx_t_2; + } else { + __pyx_t_3 = __pyx_t_4; + } + if (__pyx_t_3) { + + /* "_yaml.pyx":1156 + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": + * scalar_style = YAML_FOLDED_SCALAR_STYLE # <<<<<<<<<<<<<< + * if yaml_scalar_event_initialize(event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: + */ + __pyx_v_scalar_style = YAML_FOLDED_SCALAR_STYLE; + goto __pyx_L38; + } + __pyx_L38:; + + /* "_yaml.pyx":1158 + * scalar_style = YAML_FOLDED_SCALAR_STYLE + * if yaml_scalar_event_initialize(event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * elif event_class is SequenceStartEvent: + */ + __pyx_t_3 = ((yaml_scalar_event_initialize(__pyx_v_event, __pyx_v_anchor, __pyx_v_tag, __pyx_v_value, __pyx_v_length, __pyx_v_plain_implicit, __pyx_v_quoted_implicit, __pyx_v_scalar_style) == 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1159 + * if yaml_scalar_event_initialize(event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * elif event_class is SequenceStartEvent: + * anchor = NULL + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + + /* "_yaml.pyx":1160 + * plain_implicit, quoted_implicit, scalar_style) == 0: + * raise MemoryError + * elif event_class is SequenceStartEvent: # <<<<<<<<<<<<<< + * anchor = NULL + * anchor_object = event_object.anchor + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceStartEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1161 + * raise MemoryError + * elif event_class is SequenceStartEvent: + * anchor = NULL # <<<<<<<<<<<<<< + * anchor_object = event_object.anchor + * if anchor_object is not None: + */ + __pyx_v_anchor = NULL; + + /* "_yaml.pyx":1162 + * elif event_class is SequenceStartEvent: + * anchor = NULL + * anchor_object = event_object.anchor # <<<<<<<<<<<<<< + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_anchor); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1162; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_anchor_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1163 + * anchor = NULL + * anchor_object = event_object.anchor + * if anchor_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + */ + __pyx_t_4 = (__pyx_v_anchor_object != Py_None); + __pyx_t_3 = (__pyx_t_4 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1164 + * anchor_object = event_object.anchor + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + */ + __pyx_t_3 = (PyUnicode_CheckExact(__pyx_v_anchor_object) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1165 + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_anchor_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_anchor_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L41; + } + __pyx_L41:; + + /* "_yaml.pyx":1166 + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") + */ + __pyx_t_3 = ((!(PyString_CheckExact(__pyx_v_anchor_object) != 0)) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1167 + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("anchor must be a string") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1168 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__36, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1170 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__37, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1171 + * else: + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) # <<<<<<<<<<<<<< + * tag = NULL + * tag_object = event_object.tag + */ + __pyx_v_anchor = PyString_AS_STRING(__pyx_v_anchor_object); + goto __pyx_L40; + } + __pyx_L40:; + + /* "_yaml.pyx":1172 + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL # <<<<<<<<<<<<<< + * tag_object = event_object.tag + * if tag_object is not None: + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1173 + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + * tag_object = event_object.tag # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tag); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_tag_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1174 + * tag = NULL + * tag_object = event_object.tag + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_3 = (__pyx_v_tag_object != Py_None); + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1175 + * tag_object = event_object.tag + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1176 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1176; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L45; + } + __pyx_L45:; + + /* "_yaml.pyx":1177 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1178 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1179 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__38, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1181 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__39, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1182 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * implicit = 0 + * if event_object.implicit: + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L44; + } + __pyx_L44:; + + /* "_yaml.pyx":1183 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 # <<<<<<<<<<<<<< + * if event_object.implicit: + * implicit = 1 + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":1184 + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + * if event_object.implicit: # <<<<<<<<<<<<<< + * implicit = 1 + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_implicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_4) { + + /* "_yaml.pyx":1185 + * implicit = 0 + * if event_object.implicit: + * implicit = 1 # <<<<<<<<<<<<<< + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if event_object.flow_style: + */ + __pyx_v_implicit = 1; + goto __pyx_L48; + } + __pyx_L48:; + + /* "_yaml.pyx":1186 + * if event_object.implicit: + * implicit = 1 + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE # <<<<<<<<<<<<<< + * if event_object.flow_style: + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + */ + __pyx_v_sequence_style = YAML_BLOCK_SEQUENCE_STYLE; + + /* "_yaml.pyx":1187 + * implicit = 1 + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if event_object.flow_style: # <<<<<<<<<<<<<< + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + * if yaml_sequence_start_event_initialize(event, anchor, tag, + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_flow_style); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_4) { + + /* "_yaml.pyx":1188 + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if event_object.flow_style: + * sequence_style = YAML_FLOW_SEQUENCE_STYLE # <<<<<<<<<<<<<< + * if yaml_sequence_start_event_initialize(event, anchor, tag, + * implicit, sequence_style) == 0: + */ + __pyx_v_sequence_style = YAML_FLOW_SEQUENCE_STYLE; + goto __pyx_L49; + } + __pyx_L49:; + + /* "_yaml.pyx":1190 + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + * if yaml_sequence_start_event_initialize(event, anchor, tag, + * implicit, sequence_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * elif event_class is MappingStartEvent: + */ + __pyx_t_4 = ((yaml_sequence_start_event_initialize(__pyx_v_event, __pyx_v_anchor, __pyx_v_tag, __pyx_v_implicit, __pyx_v_sequence_style) == 0) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1191 + * if yaml_sequence_start_event_initialize(event, anchor, tag, + * implicit, sequence_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * elif event_class is MappingStartEvent: + * anchor = NULL + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + + /* "_yaml.pyx":1192 + * implicit, sequence_style) == 0: + * raise MemoryError + * elif event_class is MappingStartEvent: # <<<<<<<<<<<<<< + * anchor = NULL + * anchor_object = event_object.anchor + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingStartEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_3 = (__pyx_t_4 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1193 + * raise MemoryError + * elif event_class is MappingStartEvent: + * anchor = NULL # <<<<<<<<<<<<<< + * anchor_object = event_object.anchor + * if anchor_object is not None: + */ + __pyx_v_anchor = NULL; + + /* "_yaml.pyx":1194 + * elif event_class is MappingStartEvent: + * anchor = NULL + * anchor_object = event_object.anchor # <<<<<<<<<<<<<< + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_anchor); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_anchor_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1195 + * anchor = NULL + * anchor_object = event_object.anchor + * if anchor_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + */ + __pyx_t_3 = (__pyx_v_anchor_object != Py_None); + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1196 + * anchor_object = event_object.anchor + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + */ + __pyx_t_4 = (PyUnicode_CheckExact(__pyx_v_anchor_object) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1197 + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_anchor_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_anchor_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L52; + } + __pyx_L52:; + + /* "_yaml.pyx":1198 + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") + */ + __pyx_t_4 = ((!(PyString_CheckExact(__pyx_v_anchor_object) != 0)) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1199 + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("anchor must be a string") + * else: + */ + __pyx_t_4 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1200 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__40, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1202 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__41, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1203 + * else: + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) # <<<<<<<<<<<<<< + * tag = NULL + * tag_object = event_object.tag + */ + __pyx_v_anchor = PyString_AS_STRING(__pyx_v_anchor_object); + goto __pyx_L51; + } + __pyx_L51:; + + /* "_yaml.pyx":1204 + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL # <<<<<<<<<<<<<< + * tag_object = event_object.tag + * if tag_object is not None: + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1205 + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + * tag_object = event_object.tag # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_tag); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_tag_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1206 + * tag = NULL + * tag_object = event_object.tag + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_4 = (__pyx_v_tag_object != Py_None); + __pyx_t_3 = (__pyx_t_4 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1207 + * tag_object = event_object.tag + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_3 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1208 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L56; + } + __pyx_L56:; + + /* "_yaml.pyx":1209 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_3 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1210 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1211 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__42, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1213 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__43, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1214 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * implicit = 0 + * if event_object.implicit: + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L55; + } + __pyx_L55:; + + /* "_yaml.pyx":1215 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 # <<<<<<<<<<<<<< + * if event_object.implicit: + * implicit = 1 + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":1216 + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + * if event_object.implicit: # <<<<<<<<<<<<<< + * implicit = 1 + * mapping_style = YAML_BLOCK_MAPPING_STYLE + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_implicit); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1216; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_3) { + + /* "_yaml.pyx":1217 + * implicit = 0 + * if event_object.implicit: + * implicit = 1 # <<<<<<<<<<<<<< + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if event_object.flow_style: + */ + __pyx_v_implicit = 1; + goto __pyx_L59; + } + __pyx_L59:; + + /* "_yaml.pyx":1218 + * if event_object.implicit: + * implicit = 1 + * mapping_style = YAML_BLOCK_MAPPING_STYLE # <<<<<<<<<<<<<< + * if event_object.flow_style: + * mapping_style = YAML_FLOW_MAPPING_STYLE + */ + __pyx_v_mapping_style = YAML_BLOCK_MAPPING_STYLE; + + /* "_yaml.pyx":1219 + * implicit = 1 + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if event_object.flow_style: # <<<<<<<<<<<<<< + * mapping_style = YAML_FLOW_MAPPING_STYLE + * if yaml_mapping_start_event_initialize(event, anchor, tag, + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_event_object, __pyx_n_s_flow_style); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_3) { + + /* "_yaml.pyx":1220 + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if event_object.flow_style: + * mapping_style = YAML_FLOW_MAPPING_STYLE # <<<<<<<<<<<<<< + * if yaml_mapping_start_event_initialize(event, anchor, tag, + * implicit, mapping_style) == 0: + */ + __pyx_v_mapping_style = YAML_FLOW_MAPPING_STYLE; + goto __pyx_L60; + } + __pyx_L60:; + + /* "_yaml.pyx":1222 + * mapping_style = YAML_FLOW_MAPPING_STYLE + * if yaml_mapping_start_event_initialize(event, anchor, tag, + * implicit, mapping_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * elif event_class is SequenceEndEvent: + */ + __pyx_t_3 = ((yaml_mapping_start_event_initialize(__pyx_v_event, __pyx_v_anchor, __pyx_v_tag, __pyx_v_implicit, __pyx_v_mapping_style) == 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1223 + * if yaml_mapping_start_event_initialize(event, anchor, tag, + * implicit, mapping_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * elif event_class is SequenceEndEvent: + * yaml_sequence_end_event_initialize(event) + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L3; + } + + /* "_yaml.pyx":1224 + * implicit, mapping_style) == 0: + * raise MemoryError + * elif event_class is SequenceEndEvent: # <<<<<<<<<<<<<< + * yaml_sequence_end_event_initialize(event) + * elif event_class is MappingEndEvent: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceEndEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1224; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_3 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "_yaml.pyx":1225 + * raise MemoryError + * elif event_class is SequenceEndEvent: + * yaml_sequence_end_event_initialize(event) # <<<<<<<<<<<<<< + * elif event_class is MappingEndEvent: + * yaml_mapping_end_event_initialize(event) + */ + yaml_sequence_end_event_initialize(__pyx_v_event); + goto __pyx_L3; + } + + /* "_yaml.pyx":1226 + * elif event_class is SequenceEndEvent: + * yaml_sequence_end_event_initialize(event) + * elif event_class is MappingEndEvent: # <<<<<<<<<<<<<< + * yaml_mapping_end_event_initialize(event) + * else: + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingEndEvent); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1226; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = (__pyx_v_event_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_3 = (__pyx_t_4 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1227 + * yaml_sequence_end_event_initialize(event) + * elif event_class is MappingEndEvent: + * yaml_mapping_end_event_initialize(event) # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + yaml_mapping_end_event_initialize(__pyx_v_event); + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":1229 + * yaml_mapping_end_event_initialize(event) + * else: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("invalid event %s" % event_object) + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1230 + * else: + * if PY_MAJOR_VERSION < 3: + * raise TypeError("invalid event %s" % event_object) # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"invalid event %s" % event_object) + */ + __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_invalid_event_s, __pyx_v_event_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1232 + * raise TypeError("invalid event %s" % event_object) + * else: + * raise TypeError(u"invalid event %s" % event_object) # <<<<<<<<<<<<<< + * return 1 + * + */ + __pyx_t_5 = PyUnicode_Format(__pyx_kp_u_invalid_event_s, __pyx_v_event_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_9, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + __pyx_L3:; + + /* "_yaml.pyx":1233 + * else: + * raise TypeError(u"invalid event %s" % event_object) + * return 1 # <<<<<<<<<<<<<< + * + * def emit(self, event_object): + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":1016 + * raise ValueError(u"no emitter error") + * + * cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0: # <<<<<<<<<<<<<< + * cdef yaml_encoding_t encoding + * cdef yaml_version_directive_t version_directive_value + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("_yaml.CEmitter._object_to_event", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_event_class); + __Pyx_XDECREF(__pyx_v_cache); + __Pyx_XDECREF(__pyx_v_handle); + __Pyx_XDECREF(__pyx_v_prefix); + __Pyx_XDECREF(__pyx_v_anchor_object); + __Pyx_XDECREF(__pyx_v_tag_object); + __Pyx_XDECREF(__pyx_v_value_object); + __Pyx_XDECREF(__pyx_v_style_object); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1235 + * return 1 + * + * def emit(self, event_object): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * self._object_to_event(event_object, &event) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_8CEmitter_7emit(PyObject *__pyx_v_self, PyObject *__pyx_v_event_object); /*proto*/ +static PyObject *__pyx_pw_5_yaml_8CEmitter_7emit(PyObject *__pyx_v_self, PyObject *__pyx_v_event_object) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("emit (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_8CEmitter_6emit(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self), ((PyObject *)__pyx_v_event_object)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_8CEmitter_6emit(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_event_object) { + yaml_event_t __pyx_v_event; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("emit", 0); + + /* "_yaml.pyx":1237 + * def emit(self, event_object): + * cdef yaml_event_t event + * self._object_to_event(event_object, &event) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_object_to_event(__pyx_v_self, __pyx_v_event_object, (&__pyx_v_event)); if (unlikely(__pyx_t_1 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1237; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1238 + * cdef yaml_event_t event + * self._object_to_event(event_object, &event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_1 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1238; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((__pyx_t_1 == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1239 + * self._object_to_event(event_object, &event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1239; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_error = __pyx_t_3; + __pyx_t_3 = 0; + + /* "_yaml.pyx":1240 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * + * def open(self): + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1240; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1235 + * return 1 + * + * def emit(self, event_object): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * self._object_to_event(event_object, &event) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CEmitter.emit", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1242 + * raise error + * + * def open(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef yaml_encoding_t encoding + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_8CEmitter_9open(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_8CEmitter_9open(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("open (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_8CEmitter_8open(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_8CEmitter_8open(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self) { + yaml_event_t __pyx_v_event; + yaml_encoding_t __pyx_v_encoding; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("open", 0); + + /* "_yaml.pyx":1261 + * raise error + * self.closed = 0 + * elif self.closed == 1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") + */ + switch (__pyx_v_self->closed) { + + /* "_yaml.pyx":1245 + * cdef yaml_event_t event + * cdef yaml_encoding_t encoding + * if self.closed == -1: # <<<<<<<<<<<<<< + * if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING + */ + case -1: + + /* "_yaml.pyx":1246 + * cdef yaml_encoding_t encoding + * if self.closed == -1: + * if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le': # <<<<<<<<<<<<<< + * encoding = YAML_UTF16LE_ENCODING + * elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be': + */ + __pyx_t_1 = (__Pyx_PyUnicode_Equals(__pyx_v_self->use_encoding, __pyx_kp_u_utf_16_le, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_1) { + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_self->use_encoding, __pyx_kp_s_utf_16_le, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __pyx_t_2; + } else { + __pyx_t_3 = __pyx_t_1; + } + if (__pyx_t_3) { + + /* "_yaml.pyx":1247 + * if self.closed == -1: + * if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING # <<<<<<<<<<<<<< + * elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be': + * encoding = YAML_UTF16BE_ENCODING + */ + __pyx_v_encoding = YAML_UTF16LE_ENCODING; + goto __pyx_L3; + } + + /* "_yaml.pyx":1248 + * if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le': + * encoding = YAML_UTF16LE_ENCODING + * elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be': # <<<<<<<<<<<<<< + * encoding = YAML_UTF16BE_ENCODING + * else: + */ + __pyx_t_3 = (__Pyx_PyUnicode_Equals(__pyx_v_self->use_encoding, __pyx_kp_u_utf_16_be, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_3) { + __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_self->use_encoding, __pyx_kp_s_utf_16_be, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __pyx_t_1; + } else { + __pyx_t_2 = __pyx_t_3; + } + if (__pyx_t_2) { + + /* "_yaml.pyx":1249 + * encoding = YAML_UTF16LE_ENCODING + * elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be': + * encoding = YAML_UTF16BE_ENCODING # <<<<<<<<<<<<<< + * else: + * encoding = YAML_UTF8_ENCODING + */ + __pyx_v_encoding = YAML_UTF16BE_ENCODING; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":1251 + * encoding = YAML_UTF16BE_ENCODING + * else: + * encoding = YAML_UTF8_ENCODING # <<<<<<<<<<<<<< + * if self.use_encoding is None: + * self.dump_unicode = 1 + */ + __pyx_v_encoding = YAML_UTF8_ENCODING; + } + __pyx_L3:; + + /* "_yaml.pyx":1252 + * else: + * encoding = YAML_UTF8_ENCODING + * if self.use_encoding is None: # <<<<<<<<<<<<<< + * self.dump_unicode = 1 + * if self.dump_unicode == 1: + */ + __pyx_t_2 = (__pyx_v_self->use_encoding == Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1253 + * encoding = YAML_UTF8_ENCODING + * if self.use_encoding is None: + * self.dump_unicode = 1 # <<<<<<<<<<<<<< + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING + */ + __pyx_v_self->dump_unicode = 1; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":1254 + * if self.use_encoding is None: + * self.dump_unicode = 1 + * if self.dump_unicode == 1: # <<<<<<<<<<<<<< + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(&event, encoding) + */ + __pyx_t_3 = ((__pyx_v_self->dump_unicode == 1) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1255 + * self.dump_unicode = 1 + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING # <<<<<<<<<<<<<< + * yaml_stream_start_event_initialize(&event, encoding) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_v_encoding = YAML_UTF8_ENCODING; + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":1256 + * if self.dump_unicode == 1: + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(&event, encoding) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + yaml_stream_start_event_initialize((&__pyx_v_event), __pyx_v_encoding); + + /* "_yaml.pyx":1257 + * encoding = YAML_UTF8_ENCODING + * yaml_stream_start_event_initialize(&event, encoding) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1258 + * yaml_stream_start_event_initialize(&event, encoding) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * self.closed = 0 + */ + __pyx_t_5 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1258; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_error = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1259 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * self.closed = 0 + * elif self.closed == 1: + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1260 + * error = self._emitter_error() + * raise error + * self.closed = 0 # <<<<<<<<<<<<<< + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_v_self->closed = 0; + break; + + /* "_yaml.pyx":1261 + * raise error + * self.closed = 0 + * elif self.closed == 1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") + */ + case 1: + + /* "_yaml.pyx":1262 + * self.closed = 0 + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise SerializerError("serializer is closed") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1263 + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is closed") + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1265 + * raise SerializerError("serializer is closed") + * else: + * raise SerializerError(u"serializer is closed") # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__45, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + default: + + /* "_yaml.pyx":1267 + * raise SerializerError(u"serializer is closed") + * else: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise SerializerError("serializer is already opened") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1268 + * else: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is already opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is already opened") + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__46, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1270 + * raise SerializerError("serializer is already opened") + * else: + * raise SerializerError(u"serializer is already opened") # <<<<<<<<<<<<<< + * + * def close(self): + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__47, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + + /* "_yaml.pyx":1242 + * raise error + * + * def open(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef yaml_encoding_t encoding + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("_yaml.CEmitter.open", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1272 + * raise SerializerError(u"serializer is already opened") + * + * def close(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * if self.closed == -1: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_8CEmitter_11close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_5_yaml_8CEmitter_11close(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("close (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_8CEmitter_10close(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_8CEmitter_10close(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self) { + yaml_event_t __pyx_v_event; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("close", 0); + + /* "_yaml.pyx":1279 + * else: + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 0: # <<<<<<<<<<<<<< + * yaml_stream_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + switch (__pyx_v_self->closed) { + + /* "_yaml.pyx":1274 + * def close(self): + * cdef yaml_event_t event + * if self.closed == -1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") + */ + case -1: + + /* "_yaml.pyx":1275 + * cdef yaml_event_t event + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise SerializerError("serializer is not opened") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1276 + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is not opened") + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__48, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1278 + * raise SerializerError("serializer is not opened") + * else: + * raise SerializerError(u"serializer is not opened") # <<<<<<<<<<<<<< + * elif self.closed == 0: + * yaml_stream_end_event_initialize(&event) + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__49, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + + /* "_yaml.pyx":1279 + * else: + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 0: # <<<<<<<<<<<<<< + * yaml_stream_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + case 0: + + /* "_yaml.pyx":1280 + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 0: + * yaml_stream_end_event_initialize(&event) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + yaml_stream_end_event_initialize((&__pyx_v_event)); + + /* "_yaml.pyx":1281 + * elif self.closed == 0: + * yaml_stream_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1281; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1282 + * yaml_stream_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * self.closed = 1 + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_error = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":1283 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * self.closed = 1 + * + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1284 + * error = self._emitter_error() + * raise error + * self.closed = 1 # <<<<<<<<<<<<<< + * + * def serialize(self, node): + */ + __pyx_v_self->closed = 1; + break; + default: break; + } + + /* "_yaml.pyx":1272 + * raise SerializerError(u"serializer is already opened") + * + * def close(self): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * if self.closed == -1: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CEmitter.close", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1286 + * self.closed = 1 + * + * def serialize(self, node): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef yaml_version_directive_t version_directive_value + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5_yaml_8CEmitter_13serialize(PyObject *__pyx_v_self, PyObject *__pyx_v_node); /*proto*/ +static PyObject *__pyx_pw_5_yaml_8CEmitter_13serialize(PyObject *__pyx_v_self, PyObject *__pyx_v_node) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("serialize (wrapper)", 0); + __pyx_r = __pyx_pf_5_yaml_8CEmitter_12serialize(((struct __pyx_obj_5_yaml_CEmitter *)__pyx_v_self), ((PyObject *)__pyx_v_node)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5_yaml_8CEmitter_12serialize(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_node) { + yaml_event_t __pyx_v_event; + yaml_version_directive_t __pyx_v_version_directive_value; + yaml_version_directive_t *__pyx_v_version_directive; + yaml_tag_directive_t __pyx_v_tag_directives_value[128]; + yaml_tag_directive_t *__pyx_v_tag_directives_start; + yaml_tag_directive_t *__pyx_v_tag_directives_end; + PyObject *__pyx_v_cache = NULL; + PyObject *__pyx_v_handle = NULL; + PyObject *__pyx_v_prefix = NULL; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + int __pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("serialize", 0); + + /* "_yaml.pyx":1298 + * else: + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") + */ + switch (__pyx_v_self->closed) { + + /* "_yaml.pyx":1293 + * cdef yaml_tag_directive_t *tag_directives_start + * cdef yaml_tag_directive_t *tag_directives_end + * if self.closed == -1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") + */ + case -1: + + /* "_yaml.pyx":1294 + * cdef yaml_tag_directive_t *tag_directives_end + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise SerializerError("serializer is not opened") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1295 + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is not opened") + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__50, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1297 + * raise SerializerError("serializer is not opened") + * else: + * raise SerializerError(u"serializer is not opened") # <<<<<<<<<<<<<< + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__51, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + + /* "_yaml.pyx":1298 + * else: + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 1: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") + */ + case 1: + + /* "_yaml.pyx":1299 + * raise SerializerError(u"serializer is not opened") + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise SerializerError("serializer is closed") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1300 + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is closed") + */ + __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__52, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1302 + * raise SerializerError("serializer is closed") + * else: + * raise SerializerError(u"serializer is closed") # <<<<<<<<<<<<<< + * cache = [] + * version_directive = NULL + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_SerializerError); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__53, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + default: break; + } + + /* "_yaml.pyx":1303 + * else: + * raise SerializerError(u"serializer is closed") + * cache = [] # <<<<<<<<<<<<<< + * version_directive = NULL + * if self.use_version: + */ + __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_cache = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "_yaml.pyx":1304 + * raise SerializerError(u"serializer is closed") + * cache = [] + * version_directive = NULL # <<<<<<<<<<<<<< + * if self.use_version: + * version_directive_value.major = self.use_version[0] + */ + __pyx_v_version_directive = NULL; + + /* "_yaml.pyx":1305 + * cache = [] + * version_directive = NULL + * if self.use_version: # <<<<<<<<<<<<<< + * version_directive_value.major = self.use_version[0] + * version_directive_value.minor = self.use_version[1] + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->use_version); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1305; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":1306 + * version_directive = NULL + * if self.use_version: + * version_directive_value.major = self.use_version[0] # <<<<<<<<<<<<<< + * version_directive_value.minor = self.use_version[1] + * version_directive = &version_directive_value + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_self->use_version, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1306; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_version_directive_value.major = __pyx_t_4; + + /* "_yaml.pyx":1307 + * if self.use_version: + * version_directive_value.major = self.use_version[0] + * version_directive_value.minor = self.use_version[1] # <<<<<<<<<<<<<< + * version_directive = &version_directive_value + * tag_directives_start = NULL + */ + __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_self->use_version, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_version_directive_value.minor = __pyx_t_4; + + /* "_yaml.pyx":1308 + * version_directive_value.major = self.use_version[0] + * version_directive_value.minor = self.use_version[1] + * version_directive = &version_directive_value # <<<<<<<<<<<<<< + * tag_directives_start = NULL + * tag_directives_end = NULL + */ + __pyx_v_version_directive = (&__pyx_v_version_directive_value); + goto __pyx_L5; + } + __pyx_L5:; + + /* "_yaml.pyx":1309 + * version_directive_value.minor = self.use_version[1] + * version_directive = &version_directive_value + * tag_directives_start = NULL # <<<<<<<<<<<<<< + * tag_directives_end = NULL + * if self.use_tags: + */ + __pyx_v_tag_directives_start = NULL; + + /* "_yaml.pyx":1310 + * version_directive = &version_directive_value + * tag_directives_start = NULL + * tag_directives_end = NULL # <<<<<<<<<<<<<< + * if self.use_tags: + * if len(self.use_tags) > 128: + */ + __pyx_v_tag_directives_end = NULL; + + /* "_yaml.pyx":1311 + * tag_directives_start = NULL + * tag_directives_end = NULL + * if self.use_tags: # <<<<<<<<<<<<<< + * if len(self.use_tags) > 128: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->use_tags); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1311; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__pyx_t_1) { + + /* "_yaml.pyx":1312 + * tag_directives_end = NULL + * if self.use_tags: + * if len(self.use_tags) > 128: # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") + */ + __pyx_t_2 = __pyx_v_self->use_tags; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_5 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1312; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_1 = ((__pyx_t_5 > 128) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1313 + * if self.use_tags: + * if len(self.use_tags) > 128: + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise ValueError("too many tags") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1314 + * if len(self.use_tags) > 128: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"too many tags") + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__54, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1316 + * raise ValueError("too many tags") + * else: + * raise ValueError(u"too many tags") # <<<<<<<<<<<<<< + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + */ + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__55, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_Raise(__pyx_t_2, 0, 0, 0); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1317 + * else: + * raise ValueError(u"too many tags") + * tag_directives_start = tag_directives_value # <<<<<<<<<<<<<< + * tag_directives_end = tag_directives_value + * for handle in self.use_tags: + */ + __pyx_v_tag_directives_start = __pyx_v_tag_directives_value; + + /* "_yaml.pyx":1318 + * raise ValueError(u"too many tags") + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value # <<<<<<<<<<<<<< + * for handle in self.use_tags: + * prefix = self.use_tags[handle] + */ + __pyx_v_tag_directives_end = __pyx_v_tag_directives_value; + + /* "_yaml.pyx":1319 + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + * for handle in self.use_tags: # <<<<<<<<<<<<<< + * prefix = self.use_tags[handle] + * if PyUnicode_CheckExact(handle): + */ + if (PyList_CheckExact(__pyx_v_self->use_tags) || PyTuple_CheckExact(__pyx_v_self->use_tags)) { + __pyx_t_2 = __pyx_v_self->use_tags; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_self->use_tags); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext; + } + for (;;) { + if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_2)) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_2)) { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_3 = __pyx_t_6(__pyx_t_2); + if (unlikely(!__pyx_t_3)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + __Pyx_XDECREF_SET(__pyx_v_handle, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":1320 + * tag_directives_end = tag_directives_value + * for handle in self.use_tags: + * prefix = self.use_tags[handle] # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) + */ + __pyx_t_3 = PyObject_GetItem(__pyx_v_self->use_tags, __pyx_v_handle); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_XDECREF_SET(__pyx_v_prefix, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":1321 + * for handle in self.use_tags: + * prefix = self.use_tags[handle] + * if PyUnicode_CheckExact(handle): # <<<<<<<<<<<<<< + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) + */ + __pyx_t_1 = (PyUnicode_CheckExact(__pyx_v_handle) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1322 + * prefix = self.use_tags[handle] + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) # <<<<<<<<<<<<<< + * cache.append(handle) + * if not PyString_CheckExact(handle): + */ + __pyx_t_3 = PyUnicode_AsUTF8String(__pyx_v_handle); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1322; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_handle, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":1323 + * if PyUnicode_CheckExact(handle): + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_cache, __pyx_v_handle); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1323; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L11; + } + __pyx_L11:; + + /* "_yaml.pyx":1324 + * handle = PyUnicode_AsUTF8String(handle) + * cache.append(handle) + * if not PyString_CheckExact(handle): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") + */ + __pyx_t_1 = ((!(PyString_CheckExact(__pyx_v_handle) != 0)) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1325 + * cache.append(handle) + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag handle must be a string") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1326 + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag handle must be a string") + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__56, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1328 + * raise TypeError("tag handle must be a string") + * else: + * raise TypeError(u"tag handle must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__57, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1329 + * else: + * raise TypeError(u"tag handle must be a string") + * tag_directives_end.handle = PyString_AS_STRING(handle) # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) + */ + __pyx_v_tag_directives_end->handle = PyString_AS_STRING(__pyx_v_handle); + + /* "_yaml.pyx":1330 + * raise TypeError(u"tag handle must be a string") + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): # <<<<<<<<<<<<<< + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) + */ + __pyx_t_1 = (PyUnicode_CheckExact(__pyx_v_prefix) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1331 + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) # <<<<<<<<<<<<<< + * cache.append(prefix) + * if not PyString_CheckExact(prefix): + */ + __pyx_t_3 = PyUnicode_AsUTF8String(__pyx_v_prefix); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1331; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF_SET(__pyx_v_prefix, __pyx_t_3); + __pyx_t_3 = 0; + + /* "_yaml.pyx":1332 + * if PyUnicode_CheckExact(prefix): + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_7 = __Pyx_PyList_Append(__pyx_v_cache, __pyx_v_prefix); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1332; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + goto __pyx_L14; + } + __pyx_L14:; + + /* "_yaml.pyx":1333 + * prefix = PyUnicode_AsUTF8String(prefix) + * cache.append(prefix) + * if not PyString_CheckExact(prefix): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") + */ + __pyx_t_1 = ((!(PyString_CheckExact(__pyx_v_prefix) != 0)) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1334 + * cache.append(prefix) + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag prefix must be a string") + * else: + */ + __pyx_t_1 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1335 + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag prefix must be a string") + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__58, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1337 + * raise TypeError("tag prefix must be a string") + * else: + * raise TypeError(u"tag prefix must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__59, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1338 + * else: + * raise TypeError(u"tag prefix must be a string") + * tag_directives_end.prefix = PyString_AS_STRING(prefix) # <<<<<<<<<<<<<< + * tag_directives_end = tag_directives_end+1 + * if yaml_document_start_event_initialize(&event, version_directive, + */ + __pyx_v_tag_directives_end->prefix = PyString_AS_STRING(__pyx_v_prefix); + + /* "_yaml.pyx":1339 + * raise TypeError(u"tag prefix must be a string") + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 # <<<<<<<<<<<<<< + * if yaml_document_start_event_initialize(&event, version_directive, + * tag_directives_start, tag_directives_end, + */ + __pyx_v_tag_directives_end = (__pyx_v_tag_directives_end + 1); + } + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L6; + } + __pyx_L6:; + + /* "_yaml.pyx":1342 + * if yaml_document_start_event_initialize(&event, version_directive, + * tag_directives_start, tag_directives_end, + * self.document_start_implicit) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_1 = ((yaml_document_start_event_initialize((&__pyx_v_event), __pyx_v_version_directive, __pyx_v_tag_directives_start, __pyx_v_tag_directives_end, __pyx_v_self->document_start_implicit) == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1343 + * tag_directives_start, tag_directives_end, + * self.document_start_implicit) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1344 + * self.document_start_implicit) == 0: + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1344; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1345 + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * self._anchor_node(node) + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1345; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_error = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":1346 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * self._anchor_node(node) + * self._serialize_node(node, None, None) + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1346; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1347 + * error = self._emitter_error() + * raise error + * self._anchor_node(node) # <<<<<<<<<<<<<< + * self._serialize_node(node, None, None) + * yaml_document_end_event_initialize(&event, self.document_end_implicit) + */ + __pyx_t_4 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_anchor_node(__pyx_v_self, __pyx_v_node); if (unlikely(__pyx_t_4 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1347; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1348 + * raise error + * self._anchor_node(node) + * self._serialize_node(node, None, None) # <<<<<<<<<<<<<< + * yaml_document_end_event_initialize(&event, self.document_end_implicit) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_4 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_serialize_node(__pyx_v_self, __pyx_v_node, Py_None, Py_None); if (unlikely(__pyx_t_4 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1348; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1349 + * self._anchor_node(node) + * self._serialize_node(node, None, None) + * yaml_document_end_event_initialize(&event, self.document_end_implicit) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + yaml_document_end_event_initialize((&__pyx_v_event), __pyx_v_self->document_end_implicit); + + /* "_yaml.pyx":1350 + * self._serialize_node(node, None, None) + * yaml_document_end_event_initialize(&event, self.document_end_implicit) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1350; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_1 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1351 + * yaml_document_end_event_initialize(&event, self.document_end_implicit) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * self.serialized_nodes = {} + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_error = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":1352 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * self.serialized_nodes = {} + * self.anchors = {} + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1352; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1353 + * error = self._emitter_error() + * raise error + * self.serialized_nodes = {} # <<<<<<<<<<<<<< + * self.anchors = {} + * self.last_alias_id = 0 + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1353; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->serialized_nodes); + __Pyx_DECREF(__pyx_v_self->serialized_nodes); + __pyx_v_self->serialized_nodes = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":1354 + * raise error + * self.serialized_nodes = {} + * self.anchors = {} # <<<<<<<<<<<<<< + * self.last_alias_id = 0 + * + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1354; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->anchors); + __Pyx_DECREF(__pyx_v_self->anchors); + __pyx_v_self->anchors = __pyx_t_2; + __pyx_t_2 = 0; + + /* "_yaml.pyx":1355 + * self.serialized_nodes = {} + * self.anchors = {} + * self.last_alias_id = 0 # <<<<<<<<<<<<<< + * + * cdef int _anchor_node(self, object node) except 0: + */ + __pyx_v_self->last_alias_id = 0; + + /* "_yaml.pyx":1286 + * self.closed = 1 + * + * def serialize(self, node): # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef yaml_version_directive_t version_directive_value + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("_yaml.CEmitter.serialize", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_cache); + __Pyx_XDECREF(__pyx_v_handle); + __Pyx_XDECREF(__pyx_v_prefix); + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1357 + * self.last_alias_id = 0 + * + * cdef int _anchor_node(self, object node) except 0: # <<<<<<<<<<<<<< + * if node in self.anchors: + * if self.anchors[node] is None: + */ + +static int __pyx_f_5_yaml_8CEmitter__anchor_node(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_node) { + PyObject *__pyx_v_node_class = NULL; + PyObject *__pyx_v_item = NULL; + PyObject *__pyx_v_key = NULL; + PyObject *__pyx_v_value = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + PyObject *(*__pyx_t_6)(PyObject *); + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *(*__pyx_t_11)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_anchor_node", 0); + + /* "_yaml.pyx":1358 + * + * cdef int _anchor_node(self, object node) except 0: + * if node in self.anchors: # <<<<<<<<<<<<<< + * if self.anchors[node] is None: + * self.last_alias_id = self.last_alias_id+1 + */ + __pyx_t_1 = (__Pyx_PySequence_Contains(__pyx_v_node, __pyx_v_self->anchors, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1359 + * cdef int _anchor_node(self, object node) except 0: + * if node in self.anchors: + * if self.anchors[node] is None: # <<<<<<<<<<<<<< + * self.last_alias_id = self.last_alias_id+1 + * self.anchors[node] = u"id%03d" % self.last_alias_id + */ + __pyx_t_3 = PyObject_GetItem(__pyx_v_self->anchors, __pyx_v_node); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = (__pyx_t_3 == Py_None); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1360 + * if node in self.anchors: + * if self.anchors[node] is None: + * self.last_alias_id = self.last_alias_id+1 # <<<<<<<<<<<<<< + * self.anchors[node] = u"id%03d" % self.last_alias_id + * else: + */ + __pyx_v_self->last_alias_id = (__pyx_v_self->last_alias_id + 1); + + /* "_yaml.pyx":1361 + * if self.anchors[node] is None: + * self.last_alias_id = self.last_alias_id+1 + * self.anchors[node] = u"id%03d" % self.last_alias_id # <<<<<<<<<<<<<< + * else: + * self.anchors[node] = None + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_self->last_alias_id); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyUnicode_Format(__pyx_kp_u_id_03d, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(PyObject_SetItem(__pyx_v_self->anchors, __pyx_v_node, __pyx_t_4) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1361; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L4; + } + __pyx_L4:; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":1363 + * self.anchors[node] = u"id%03d" % self.last_alias_id + * else: + * self.anchors[node] = None # <<<<<<<<<<<<<< + * node_class = node.__class__ + * if node_class is SequenceNode: + */ + if (unlikely(PyObject_SetItem(__pyx_v_self->anchors, __pyx_v_node, Py_None) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1363; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1364 + * else: + * self.anchors[node] = None + * node_class = node.__class__ # <<<<<<<<<<<<<< + * if node_class is SequenceNode: + * for item in node.value: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_class); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1364; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_node_class = __pyx_t_4; + __pyx_t_4 = 0; + + /* "_yaml.pyx":1365 + * self.anchors[node] = None + * node_class = node.__class__ + * if node_class is SequenceNode: # <<<<<<<<<<<<<< + * for item in node.value: + * self._anchor_node(item) + */ + __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1365; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = (__pyx_v_node_class == __pyx_t_4); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1366 + * node_class = node.__class__ + * if node_class is SequenceNode: + * for item in node.value: # <<<<<<<<<<<<<< + * self._anchor_node(item) + * elif node_class is MappingNode: + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) { + __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = Py_TYPE(__pyx_t_3)->tp_iternext; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + for (;;) { + if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_3)) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_3)) { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_3)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_5); __Pyx_INCREF(__pyx_t_4); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_4 = __pyx_t_6(__pyx_t_3); + if (unlikely(!__pyx_t_4)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_4); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_4); + __pyx_t_4 = 0; + + /* "_yaml.pyx":1367 + * if node_class is SequenceNode: + * for item in node.value: + * self._anchor_node(item) # <<<<<<<<<<<<<< + * elif node_class is MappingNode: + * for key, value in node.value: + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_anchor_node(__pyx_v_self, __pyx_v_item); if (unlikely(__pyx_t_7 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1367; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + goto __pyx_L5; + } + + /* "_yaml.pyx":1368 + * for item in node.value: + * self._anchor_node(item) + * elif node_class is MappingNode: # <<<<<<<<<<<<<< + * for key, value in node.value: + * self._anchor_node(key) + */ + __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingNode); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1368; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_2 = (__pyx_v_node_class == __pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "_yaml.pyx":1369 + * self._anchor_node(item) + * elif node_class is MappingNode: + * for key, value in node.value: # <<<<<<<<<<<<<< + * self._anchor_node(key) + * self._anchor_node(value) + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) { + __pyx_t_4 = __pyx_t_3; __Pyx_INCREF(__pyx_t_4); __pyx_t_5 = 0; + __pyx_t_6 = NULL; + } else { + __pyx_t_5 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_6 = Py_TYPE(__pyx_t_4)->tp_iternext; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + for (;;) { + if (!__pyx_t_6 && PyList_CheckExact(__pyx_t_4)) { + if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_6 && PyTuple_CheckExact(__pyx_t_4)) { + if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_4)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_5); __Pyx_INCREF(__pyx_t_3); __pyx_t_5++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_3 = __pyx_t_6(__pyx_t_4); + if (unlikely(!__pyx_t_3)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_3); + } + if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { + PyObject* sequence = __pyx_t_3; + #if CYTHON_COMPILING_IN_CPYTHON + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if CYTHON_COMPILING_IN_CPYTHON + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_9 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_8 = PyList_GET_ITEM(sequence, 0); + __pyx_t_9 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(__pyx_t_9); + #else + __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_9); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_10 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_11 = Py_TYPE(__pyx_t_10)->tp_iternext; + index = 0; __pyx_t_8 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_8)) goto __pyx_L10_unpacking_failed; + __Pyx_GOTREF(__pyx_t_8); + index = 1; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L10_unpacking_failed; + __Pyx_GOTREF(__pyx_t_9); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_11 = NULL; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L11_unpacking_done; + __pyx_L10_unpacking_failed:; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + __pyx_t_11 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_L11_unpacking_done:; + } + __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_8); + __pyx_t_8 = 0; + __Pyx_XDECREF_SET(__pyx_v_value, __pyx_t_9); + __pyx_t_9 = 0; + + /* "_yaml.pyx":1370 + * elif node_class is MappingNode: + * for key, value in node.value: + * self._anchor_node(key) # <<<<<<<<<<<<<< + * self._anchor_node(value) + * return 1 + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_anchor_node(__pyx_v_self, __pyx_v_key); if (unlikely(__pyx_t_7 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1370; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1371 + * for key, value in node.value: + * self._anchor_node(key) + * self._anchor_node(value) # <<<<<<<<<<<<<< + * return 1 + * + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_anchor_node(__pyx_v_self, __pyx_v_value); if (unlikely(__pyx_t_7 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1371; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + goto __pyx_L5; + } + __pyx_L5:; + } + __pyx_L3:; + + /* "_yaml.pyx":1372 + * self._anchor_node(key) + * self._anchor_node(value) + * return 1 # <<<<<<<<<<<<<< + * + * cdef int _serialize_node(self, object node, object parent, object index) except 0: + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":1357 + * self.last_alias_id = 0 + * + * cdef int _anchor_node(self, object node) except 0: # <<<<<<<<<<<<<< + * if node in self.anchors: + * if self.anchors[node] is None: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_AddTraceback("_yaml.CEmitter._anchor_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_node_class); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XDECREF(__pyx_v_key); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1374 + * return 1 + * + * cdef int _serialize_node(self, object node, object parent, object index) except 0: # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef int implicit + */ + +static int __pyx_f_5_yaml_8CEmitter__serialize_node(struct __pyx_obj_5_yaml_CEmitter *__pyx_v_self, PyObject *__pyx_v_node, PyObject *__pyx_v_parent, PyObject *__pyx_v_index) { + yaml_event_t __pyx_v_event; + int __pyx_v_implicit; + int __pyx_v_plain_implicit; + int __pyx_v_quoted_implicit; + char *__pyx_v_anchor; + char *__pyx_v_tag; + char *__pyx_v_value; + int __pyx_v_length; + int __pyx_v_item_index; + yaml_scalar_style_t __pyx_v_scalar_style; + yaml_sequence_style_t __pyx_v_sequence_style; + yaml_mapping_style_t __pyx_v_mapping_style; + PyObject *__pyx_v_anchor_object = NULL; + PyObject *__pyx_v_error = NULL; + PyObject *__pyx_v_node_class = NULL; + PyObject *__pyx_v_tag_object = NULL; + PyObject *__pyx_v_value_object = NULL; + PyObject *__pyx_v_style_object = NULL; + PyObject *__pyx_v_item = NULL; + PyObject *__pyx_v_item_key = NULL; + PyObject *__pyx_v_item_value = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + Py_ssize_t __pyx_t_9; + PyObject *(*__pyx_t_10)(PyObject *); + PyObject *__pyx_t_11 = NULL; + PyObject *(*__pyx_t_12)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_serialize_node", 0); + + /* "_yaml.pyx":1387 + * cdef yaml_sequence_style_t sequence_style + * cdef yaml_mapping_style_t mapping_style + * anchor_object = self.anchors[node] # <<<<<<<<<<<<<< + * anchor = NULL + * if anchor_object is not None: + */ + __pyx_t_1 = PyObject_GetItem(__pyx_v_self->anchors, __pyx_v_node); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_anchor_object = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":1388 + * cdef yaml_mapping_style_t mapping_style + * anchor_object = self.anchors[node] + * anchor = NULL # <<<<<<<<<<<<<< + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + */ + __pyx_v_anchor = NULL; + + /* "_yaml.pyx":1389 + * anchor_object = self.anchors[node] + * anchor = NULL + * if anchor_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + */ + __pyx_t_2 = (__pyx_v_anchor_object != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1390 + * anchor = NULL + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + */ + __pyx_t_3 = (PyUnicode_CheckExact(__pyx_v_anchor_object) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1391 + * if anchor_object is not None: + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_1 = PyUnicode_AsUTF8String(__pyx_v_anchor_object); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1391; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_anchor_object, __pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L4; + } + __pyx_L4:; + + /* "_yaml.pyx":1392 + * if PyUnicode_CheckExact(anchor_object): + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") + */ + __pyx_t_3 = ((!(PyString_CheckExact(__pyx_v_anchor_object) != 0)) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1393 + * anchor_object = PyUnicode_AsUTF8String(anchor_object) + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("anchor must be a string") + * else: + */ + __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1394 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__60, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1396 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * if node in self.serialized_nodes: + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__61, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1397 + * else: + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) # <<<<<<<<<<<<<< + * if node in self.serialized_nodes: + * if yaml_alias_event_initialize(&event, anchor) == 0: + */ + __pyx_v_anchor = PyString_AS_STRING(__pyx_v_anchor_object); + goto __pyx_L3; + } + __pyx_L3:; + + /* "_yaml.pyx":1398 + * raise TypeError(u"anchor must be a string") + * anchor = PyString_AS_STRING(anchor_object) + * if node in self.serialized_nodes: # <<<<<<<<<<<<<< + * if yaml_alias_event_initialize(&event, anchor) == 0: + * raise MemoryError + */ + __pyx_t_3 = (__Pyx_PySequence_Contains(__pyx_v_node, __pyx_v_self->serialized_nodes, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1398; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = (__pyx_t_3 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1399 + * anchor = PyString_AS_STRING(anchor_object) + * if node in self.serialized_nodes: + * if yaml_alias_event_initialize(&event, anchor) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_2 = ((yaml_alias_event_initialize((&__pyx_v_event), __pyx_v_anchor) == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1400 + * if node in self.serialized_nodes: + * if yaml_alias_event_initialize(&event, anchor) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1400; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1401 + * if yaml_alias_event_initialize(&event, anchor) == 0: + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1401; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1402 + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * else: + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1402; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_error = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":1403 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * else: + * node_class = node.__class__ + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1403; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L7; + } + /*else*/ { + + /* "_yaml.pyx":1405 + * raise error + * else: + * node_class = node.__class__ # <<<<<<<<<<<<<< + * self.serialized_nodes[node] = True + * self.descend_resolver(parent, index) + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_class); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1405; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_node_class = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":1406 + * else: + * node_class = node.__class__ + * self.serialized_nodes[node] = True # <<<<<<<<<<<<<< + * self.descend_resolver(parent, index) + * if node_class is ScalarNode: + */ + if (unlikely(PyObject_SetItem(__pyx_v_self->serialized_nodes, __pyx_v_node, Py_True) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1406; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1407 + * node_class = node.__class__ + * self.serialized_nodes[node] = True + * self.descend_resolver(parent, index) # <<<<<<<<<<<<<< + * if node_class is ScalarNode: + * plain_implicit = 0 + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_descend_resolver); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_parent); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_parent); + __Pyx_GIVEREF(__pyx_v_parent); + __Pyx_INCREF(__pyx_v_index); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_index); + __Pyx_GIVEREF(__pyx_v_index); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1407; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "_yaml.pyx":1408 + * self.serialized_nodes[node] = True + * self.descend_resolver(parent, index) + * if node_class is ScalarNode: # <<<<<<<<<<<<<< + * plain_implicit = 0 + * quoted_implicit = 0 + */ + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1408; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = (__pyx_v_node_class == __pyx_t_6); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "_yaml.pyx":1409 + * self.descend_resolver(parent, index) + * if node_class is ScalarNode: + * plain_implicit = 0 # <<<<<<<<<<<<<< + * quoted_implicit = 0 + * tag_object = node.tag + */ + __pyx_v_plain_implicit = 0; + + /* "_yaml.pyx":1410 + * if node_class is ScalarNode: + * plain_implicit = 0 + * quoted_implicit = 0 # <<<<<<<<<<<<<< + * tag_object = node.tag + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + */ + __pyx_v_quoted_implicit = 0; + + /* "_yaml.pyx":1411 + * plain_implicit = 0 + * quoted_implicit = 0 + * tag_object = node.tag # <<<<<<<<<<<<<< + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + * plain_implicit = 1 + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_tag); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1411; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_tag_object = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_yaml.pyx":1412 + * quoted_implicit = 0 + * tag_object = node.tag + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: # <<<<<<<<<<<<<< + * plain_implicit = 1 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_INCREF(__pyx_tuple__62); + PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_tuple__62); + __Pyx_GIVEREF(__pyx_tuple__62); + __pyx_t_5 = 0; + __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_7 = PyObject_RichCompare(__pyx_t_1, __pyx_v_tag_object, Py_EQ); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (__pyx_t_3) { + + /* "_yaml.pyx":1413 + * tag_object = node.tag + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + * plain_implicit = 1 # <<<<<<<<<<<<<< + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + * quoted_implicit = 1 + */ + __pyx_v_plain_implicit = 1; + goto __pyx_L11; + } + __pyx_L11:; + + /* "_yaml.pyx":1414 + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + * plain_implicit = 1 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: # <<<<<<<<<<<<<< + * quoted_implicit = 1 + * tag = NULL + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + __Pyx_INCREF(__pyx_tuple__63); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_tuple__63); + __Pyx_GIVEREF(__pyx_tuple__63); + __pyx_t_1 = 0; + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_5 = PyObject_RichCompare(__pyx_t_6, __pyx_v_tag_object, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (__pyx_t_3) { + + /* "_yaml.pyx":1415 + * plain_implicit = 1 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + * quoted_implicit = 1 # <<<<<<<<<<<<<< + * tag = NULL + * if tag_object is not None: + */ + __pyx_v_quoted_implicit = 1; + goto __pyx_L12; + } + __pyx_L12:; + + /* "_yaml.pyx":1416 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + * quoted_implicit = 1 + * tag = NULL # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1417 + * quoted_implicit = 1 + * tag = NULL + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_3 = (__pyx_v_tag_object != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1418 + * tag = NULL + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_2 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1419 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1419; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L14; + } + __pyx_L14:; + + /* "_yaml.pyx":1420 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_2 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1421 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_2 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1422 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__64, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1424 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * value_object = node.value + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__65, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1425 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * value_object = node.value + * if PyUnicode_CheckExact(value_object): + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L13; + } + __pyx_L13:; + + /* "_yaml.pyx":1426 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * value_object = node.value # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_value_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1427 + * tag = PyString_AS_STRING(tag_object) + * value_object = node.value + * if PyUnicode_CheckExact(value_object): # <<<<<<<<<<<<<< + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): + */ + __pyx_t_2 = (PyUnicode_CheckExact(__pyx_v_value_object) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1428 + * value_object = node.value + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_5 = PyUnicode_AsUTF8String(__pyx_v_value_object); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1428; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF_SET(__pyx_v_value_object, __pyx_t_5); + __pyx_t_5 = 0; + goto __pyx_L17; + } + __pyx_L17:; + + /* "_yaml.pyx":1429 + * if PyUnicode_CheckExact(value_object): + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") + */ + __pyx_t_2 = ((!(PyString_CheckExact(__pyx_v_value_object) != 0)) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1430 + * value_object = PyUnicode_AsUTF8String(value_object) + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("value must be a string") + * else: + */ + __pyx_t_2 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1431 + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"value must be a string") + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__66, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1433 + * raise TypeError("value must be a string") + * else: + * raise TypeError(u"value must be a string") # <<<<<<<<<<<<<< + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + */ + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__67, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_Raise(__pyx_t_5, 0, 0, 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1434 + * else: + * raise TypeError(u"value must be a string") + * value = PyString_AS_STRING(value_object) # <<<<<<<<<<<<<< + * length = PyString_GET_SIZE(value_object) + * style_object = node.style + */ + __pyx_v_value = PyString_AS_STRING(__pyx_v_value_object); + + /* "_yaml.pyx":1435 + * raise TypeError(u"value must be a string") + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) # <<<<<<<<<<<<<< + * style_object = node.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE + */ + __pyx_v_length = PyString_GET_SIZE(__pyx_v_value_object); + + /* "_yaml.pyx":1436 + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + * style_object = node.style # <<<<<<<<<<<<<< + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_style); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1436; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_style_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1437 + * length = PyString_GET_SIZE(value_object) + * style_object = node.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE # <<<<<<<<<<<<<< + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_PLAIN_SCALAR_STYLE; + + /* "_yaml.pyx":1438 + * style_object = node.style + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": # <<<<<<<<<<<<<< + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": + */ + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__7, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_2) { + __pyx_t_3 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__7, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __pyx_t_3; + } else { + __pyx_t_8 = __pyx_t_2; + } + if (__pyx_t_8) { + + /* "_yaml.pyx":1439 + * scalar_style = YAML_PLAIN_SCALAR_STYLE + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE; + goto __pyx_L20; + } + + /* "_yaml.pyx":1440 + * if style_object == "'" or style_object == u"'": + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": # <<<<<<<<<<<<<< + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": + */ + __pyx_t_8 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__8, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_8) { + __pyx_t_2 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__8, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_3 = __pyx_t_2; + } else { + __pyx_t_3 = __pyx_t_8; + } + if (__pyx_t_3) { + + /* "_yaml.pyx":1441 + * scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE; + goto __pyx_L20; + } + + /* "_yaml.pyx":1442 + * elif style_object == "\"" or style_object == u"\"": + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": # <<<<<<<<<<<<<< + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": + */ + __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__9, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_3) { + __pyx_t_8 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__9, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1442; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_2 = __pyx_t_8; + } else { + __pyx_t_2 = __pyx_t_3; + } + if (__pyx_t_2) { + + /* "_yaml.pyx":1443 + * scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE # <<<<<<<<<<<<<< + * elif style_object == ">" or style_object == u">": + * scalar_style = YAML_FOLDED_SCALAR_STYLE + */ + __pyx_v_scalar_style = YAML_LITERAL_SCALAR_STYLE; + goto __pyx_L20; + } + + /* "_yaml.pyx":1444 + * elif style_object == "|" or style_object == u"|": + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": # <<<<<<<<<<<<<< + * scalar_style = YAML_FOLDED_SCALAR_STYLE + * if yaml_scalar_event_initialize(&event, anchor, tag, value, length, + */ + __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_style_object, __pyx_kp_s__10, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!__pyx_t_2) { + __pyx_t_3 = (__Pyx_PyUnicode_Equals(__pyx_v_style_object, __pyx_kp_u__10, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1444; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = __pyx_t_3; + } else { + __pyx_t_8 = __pyx_t_2; + } + if (__pyx_t_8) { + + /* "_yaml.pyx":1445 + * scalar_style = YAML_LITERAL_SCALAR_STYLE + * elif style_object == ">" or style_object == u">": + * scalar_style = YAML_FOLDED_SCALAR_STYLE # <<<<<<<<<<<<<< + * if yaml_scalar_event_initialize(&event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: + */ + __pyx_v_scalar_style = YAML_FOLDED_SCALAR_STYLE; + goto __pyx_L20; + } + __pyx_L20:; + + /* "_yaml.pyx":1447 + * scalar_style = YAML_FOLDED_SCALAR_STYLE + * if yaml_scalar_event_initialize(&event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_8 = ((yaml_scalar_event_initialize((&__pyx_v_event), __pyx_v_anchor, __pyx_v_tag, __pyx_v_value, __pyx_v_length, __pyx_v_plain_implicit, __pyx_v_quoted_implicit, __pyx_v_scalar_style) == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1448 + * if yaml_scalar_event_initialize(&event, anchor, tag, value, length, + * plain_implicit, quoted_implicit, scalar_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1448; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1449 + * plain_implicit, quoted_implicit, scalar_style) == 0: + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1449; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1450 + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * elif node_class is SequenceNode: + */ + __pyx_t_5 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1450; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_error = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1451 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * elif node_class is SequenceNode: + * implicit = 0 + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1451; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L10; + } + + /* "_yaml.pyx":1452 + * error = self._emitter_error() + * raise error + * elif node_class is SequenceNode: # <<<<<<<<<<<<<< + * implicit = 0 + * tag_object = node.tag + */ + __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1452; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = (__pyx_v_node_class == __pyx_t_5); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = (__pyx_t_8 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1453 + * raise error + * elif node_class is SequenceNode: + * implicit = 0 # <<<<<<<<<<<<<< + * tag_object = node.tag + * if self.resolve(SequenceNode, node.value, True) == tag_object: + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":1454 + * elif node_class is SequenceNode: + * implicit = 0 + * tag_object = node.tag # <<<<<<<<<<<<<< + * if self.resolve(SequenceNode, node.value, True) == tag_object: + * implicit = 1 + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_tag); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1454; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_tag_object = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1455 + * implicit = 0 + * tag_object = node.tag + * if self.resolve(SequenceNode, node.value, True) == tag_object: # <<<<<<<<<<<<<< + * implicit = 1 + * tag = NULL + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_INCREF(Py_True); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_True); + __Pyx_GIVEREF(Py_True); + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_1, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyObject_RichCompare(__pyx_t_7, __pyx_v_tag_object, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1455; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_2) { + + /* "_yaml.pyx":1456 + * tag_object = node.tag + * if self.resolve(SequenceNode, node.value, True) == tag_object: + * implicit = 1 # <<<<<<<<<<<<<< + * tag = NULL + * if tag_object is not None: + */ + __pyx_v_implicit = 1; + goto __pyx_L23; + } + __pyx_L23:; + + /* "_yaml.pyx":1457 + * if self.resolve(SequenceNode, node.value, True) == tag_object: + * implicit = 1 + * tag = NULL # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1458 + * implicit = 1 + * tag = NULL + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_2 = (__pyx_v_tag_object != Py_None); + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1459 + * tag = NULL + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_8 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1460 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_1 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1460; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_1); + __pyx_t_1 = 0; + goto __pyx_L25; + } + __pyx_L25:; + + /* "_yaml.pyx":1461 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_8 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1462 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_8 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1463 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__68, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1465 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__69, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1466 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if node.flow_style: + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L24; + } + __pyx_L24:; + + /* "_yaml.pyx":1467 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE # <<<<<<<<<<<<<< + * if node.flow_style: + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + */ + __pyx_v_sequence_style = YAML_BLOCK_SEQUENCE_STYLE; + + /* "_yaml.pyx":1468 + * tag = PyString_AS_STRING(tag_object) + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if node.flow_style: # <<<<<<<<<<<<<< + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + * if yaml_sequence_start_event_initialize(&event, anchor, tag, + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_flow_style); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1468; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (__pyx_t_8) { + + /* "_yaml.pyx":1469 + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + * if node.flow_style: + * sequence_style = YAML_FLOW_SEQUENCE_STYLE # <<<<<<<<<<<<<< + * if yaml_sequence_start_event_initialize(&event, anchor, tag, + * implicit, sequence_style) == 0: + */ + __pyx_v_sequence_style = YAML_FLOW_SEQUENCE_STYLE; + goto __pyx_L28; + } + __pyx_L28:; + + /* "_yaml.pyx":1471 + * sequence_style = YAML_FLOW_SEQUENCE_STYLE + * if yaml_sequence_start_event_initialize(&event, anchor, tag, + * implicit, sequence_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_8 = ((yaml_sequence_start_event_initialize((&__pyx_v_event), __pyx_v_anchor, __pyx_v_tag, __pyx_v_implicit, __pyx_v_sequence_style) == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1472 + * if yaml_sequence_start_event_initialize(&event, anchor, tag, + * implicit, sequence_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1472; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1473 + * implicit, sequence_style) == 0: + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1473; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1474 + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * item_index = 0 + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1474; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_error = __pyx_t_1; + __pyx_t_1 = 0; + + /* "_yaml.pyx":1475 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * item_index = 0 + * for item in node.value: + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1475; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1476 + * error = self._emitter_error() + * raise error + * item_index = 0 # <<<<<<<<<<<<<< + * for item in node.value: + * self._serialize_node(item, node, item_index) + */ + __pyx_v_item_index = 0; + + /* "_yaml.pyx":1477 + * raise error + * item_index = 0 + * for item in node.value: # <<<<<<<<<<<<<< + * self._serialize_node(item, node, item_index) + * item_index = item_index+1 + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) { + __pyx_t_7 = __pyx_t_1; __Pyx_INCREF(__pyx_t_7); __pyx_t_9 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_9 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_10 = Py_TYPE(__pyx_t_7)->tp_iternext; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + for (;;) { + if (!__pyx_t_10 && PyList_CheckExact(__pyx_t_7)) { + if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_7, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_10 && PyTuple_CheckExact(__pyx_t_7)) { + if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_7)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_9); __Pyx_INCREF(__pyx_t_1); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_1 = PySequence_ITEM(__pyx_t_7, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_1 = __pyx_t_10(__pyx_t_7); + if (unlikely(!__pyx_t_1)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1477; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_1); + } + __Pyx_XDECREF_SET(__pyx_v_item, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":1478 + * item_index = 0 + * for item in node.value: + * self._serialize_node(item, node, item_index) # <<<<<<<<<<<<<< + * item_index = item_index+1 + * yaml_sequence_end_event_initialize(&event) + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_item_index); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1478; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_serialize_node(__pyx_v_self, __pyx_v_item, __pyx_v_node, __pyx_t_1); if (unlikely(__pyx_t_4 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1478; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":1479 + * for item in node.value: + * self._serialize_node(item, node, item_index) + * item_index = item_index+1 # <<<<<<<<<<<<<< + * yaml_sequence_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_v_item_index = (__pyx_v_item_index + 1); + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "_yaml.pyx":1480 + * self._serialize_node(item, node, item_index) + * item_index = item_index+1 + * yaml_sequence_end_event_initialize(&event) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + yaml_sequence_end_event_initialize((&__pyx_v_event)); + + /* "_yaml.pyx":1481 + * item_index = item_index+1 + * yaml_sequence_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1482 + * yaml_sequence_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * elif node_class is MappingNode: + */ + __pyx_t_7 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1482; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_error = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_yaml.pyx":1483 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * elif node_class is MappingNode: + * implicit = 0 + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1483; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L10; + } + + /* "_yaml.pyx":1484 + * error = self._emitter_error() + * raise error + * elif node_class is MappingNode: # <<<<<<<<<<<<<< + * implicit = 0 + * tag_object = node.tag + */ + __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingNode); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1484; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = (__pyx_v_node_class == __pyx_t_7); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_t_2 = (__pyx_t_8 != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1485 + * raise error + * elif node_class is MappingNode: + * implicit = 0 # <<<<<<<<<<<<<< + * tag_object = node.tag + * if self.resolve(MappingNode, node.value, True) == tag_object: + */ + __pyx_v_implicit = 0; + + /* "_yaml.pyx":1486 + * elif node_class is MappingNode: + * implicit = 0 + * tag_object = node.tag # <<<<<<<<<<<<<< + * if self.resolve(MappingNode, node.value, True) == tag_object: + * implicit = 1 + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_tag); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1486; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_v_tag_object = __pyx_t_7; + __pyx_t_7 = 0; + + /* "_yaml.pyx":1487 + * implicit = 0 + * tag_object = node.tag + * if self.resolve(MappingNode, node.value, True) == tag_object: # <<<<<<<<<<<<<< + * implicit = 1 + * tag = NULL + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_resolve); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_MappingNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __Pyx_INCREF(Py_True); + PyTuple_SET_ITEM(__pyx_t_6, 2, Py_True); + __Pyx_GIVEREF(Py_True); + __pyx_t_1 = 0; + __pyx_t_5 = 0; + __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_6 = PyObject_RichCompare(__pyx_t_5, __pyx_v_tag_object, Py_EQ); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1487; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_2) { + + /* "_yaml.pyx":1488 + * tag_object = node.tag + * if self.resolve(MappingNode, node.value, True) == tag_object: + * implicit = 1 # <<<<<<<<<<<<<< + * tag = NULL + * if tag_object is not None: + */ + __pyx_v_implicit = 1; + goto __pyx_L34; + } + __pyx_L34:; + + /* "_yaml.pyx":1489 + * if self.resolve(MappingNode, node.value, True) == tag_object: + * implicit = 1 + * tag = NULL # <<<<<<<<<<<<<< + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + */ + __pyx_v_tag = NULL; + + /* "_yaml.pyx":1490 + * implicit = 1 + * tag = NULL + * if tag_object is not None: # <<<<<<<<<<<<<< + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + */ + __pyx_t_2 = (__pyx_v_tag_object != Py_None); + __pyx_t_8 = (__pyx_t_2 != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1491 + * tag = NULL + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): # <<<<<<<<<<<<<< + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + */ + __pyx_t_8 = (PyUnicode_CheckExact(__pyx_v_tag_object) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1492 + * if tag_object is not None: + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) # <<<<<<<<<<<<<< + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + */ + __pyx_t_6 = PyUnicode_AsUTF8String(__pyx_v_tag_object); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1492; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF_SET(__pyx_v_tag_object, __pyx_t_6); + __pyx_t_6 = 0; + goto __pyx_L36; + } + __pyx_L36:; + + /* "_yaml.pyx":1493 + * if PyUnicode_CheckExact(tag_object): + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): # <<<<<<<<<<<<<< + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") + */ + __pyx_t_8 = ((!(PyString_CheckExact(__pyx_v_tag_object) != 0)) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1494 + * tag_object = PyUnicode_AsUTF8String(tag_object) + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: # <<<<<<<<<<<<<< + * raise TypeError("tag must be a string") + * else: + */ + __pyx_t_8 = ((PY_MAJOR_VERSION < 3) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1495 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__70, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + /*else*/ { + + /* "_yaml.pyx":1497 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * mapping_style = YAML_BLOCK_MAPPING_STYLE + */ + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__71, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + + /* "_yaml.pyx":1498 + * else: + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) # <<<<<<<<<<<<<< + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if node.flow_style: + */ + __pyx_v_tag = PyString_AS_STRING(__pyx_v_tag_object); + goto __pyx_L35; + } + __pyx_L35:; + + /* "_yaml.pyx":1499 + * raise TypeError(u"tag must be a string") + * tag = PyString_AS_STRING(tag_object) + * mapping_style = YAML_BLOCK_MAPPING_STYLE # <<<<<<<<<<<<<< + * if node.flow_style: + * mapping_style = YAML_FLOW_MAPPING_STYLE + */ + __pyx_v_mapping_style = YAML_BLOCK_MAPPING_STYLE; + + /* "_yaml.pyx":1500 + * tag = PyString_AS_STRING(tag_object) + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if node.flow_style: # <<<<<<<<<<<<<< + * mapping_style = YAML_FLOW_MAPPING_STYLE + * if yaml_mapping_start_event_initialize(&event, anchor, tag, + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_flow_style); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_8 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (__pyx_t_8) { + + /* "_yaml.pyx":1501 + * mapping_style = YAML_BLOCK_MAPPING_STYLE + * if node.flow_style: + * mapping_style = YAML_FLOW_MAPPING_STYLE # <<<<<<<<<<<<<< + * if yaml_mapping_start_event_initialize(&event, anchor, tag, + * implicit, mapping_style) == 0: + */ + __pyx_v_mapping_style = YAML_FLOW_MAPPING_STYLE; + goto __pyx_L39; + } + __pyx_L39:; + + /* "_yaml.pyx":1503 + * mapping_style = YAML_FLOW_MAPPING_STYLE + * if yaml_mapping_start_event_initialize(&event, anchor, tag, + * implicit, mapping_style) == 0: # <<<<<<<<<<<<<< + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_8 = ((yaml_mapping_start_event_initialize((&__pyx_v_event), __pyx_v_anchor, __pyx_v_tag, __pyx_v_implicit, __pyx_v_mapping_style) == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1504 + * if yaml_mapping_start_event_initialize(&event, anchor, tag, + * implicit, mapping_style) == 0: + * raise MemoryError # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + PyErr_NoMemory(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1504; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1505 + * implicit, mapping_style) == 0: + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1505; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1506 + * raise MemoryError + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * for item_key, item_value in node.value: + */ + __pyx_t_6 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __pyx_v_error = __pyx_t_6; + __pyx_t_6 = 0; + + /* "_yaml.pyx":1507 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * for item_key, item_value in node.value: + * self._serialize_node(item_key, node, None) + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "_yaml.pyx":1508 + * error = self._emitter_error() + * raise error + * for item_key, item_value in node.value: # <<<<<<<<<<<<<< + * self._serialize_node(item_key, node, None) + * self._serialize_node(item_value, node, item_key) + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_value); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + if (PyList_CheckExact(__pyx_t_6) || PyTuple_CheckExact(__pyx_t_6)) { + __pyx_t_5 = __pyx_t_6; __Pyx_INCREF(__pyx_t_5); __pyx_t_9 = 0; + __pyx_t_10 = NULL; + } else { + __pyx_t_9 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + for (;;) { + if (!__pyx_t_10 && PyList_CheckExact(__pyx_t_5)) { + if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else if (!__pyx_t_10 && PyTuple_CheckExact(__pyx_t_5)) { + if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_5)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_9); __Pyx_INCREF(__pyx_t_6); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + } else { + __pyx_t_6 = __pyx_t_10(__pyx_t_5); + if (unlikely(!__pyx_t_6)) { + PyObject* exc_type = PyErr_Occurred(); + if (exc_type) { + if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); + else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + break; + } + __Pyx_GOTREF(__pyx_t_6); + } + if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) { + PyObject* sequence = __pyx_t_6; + #if CYTHON_COMPILING_IN_CPYTHON + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if CYTHON_COMPILING_IN_CPYTHON + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_7 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_1 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_7 = PyList_GET_ITEM(sequence, 0); + __pyx_t_1 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_1); + #else + __pyx_t_7 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_1 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + #endif + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_11 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext; + index = 0; __pyx_t_7 = __pyx_t_12(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L44_unpacking_failed; + __Pyx_GOTREF(__pyx_t_7); + index = 1; __pyx_t_1 = __pyx_t_12(__pyx_t_11); if (unlikely(!__pyx_t_1)) goto __pyx_L44_unpacking_failed; + __Pyx_GOTREF(__pyx_t_1); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_12 = NULL; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L45_unpacking_done; + __pyx_L44_unpacking_failed:; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + __pyx_t_12 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_L45_unpacking_done:; + } + __Pyx_XDECREF_SET(__pyx_v_item_key, __pyx_t_7); + __pyx_t_7 = 0; + __Pyx_XDECREF_SET(__pyx_v_item_value, __pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":1509 + * raise error + * for item_key, item_value in node.value: + * self._serialize_node(item_key, node, None) # <<<<<<<<<<<<<< + * self._serialize_node(item_value, node, item_key) + * yaml_mapping_end_event_initialize(&event) + */ + __pyx_t_4 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_serialize_node(__pyx_v_self, __pyx_v_item_key, __pyx_v_node, Py_None); if (unlikely(__pyx_t_4 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1509; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":1510 + * for item_key, item_value in node.value: + * self._serialize_node(item_key, node, None) + * self._serialize_node(item_value, node, item_key) # <<<<<<<<<<<<<< + * yaml_mapping_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + */ + __pyx_t_4 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_serialize_node(__pyx_v_self, __pyx_v_item_value, __pyx_v_node, __pyx_v_item_key); if (unlikely(__pyx_t_4 == 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1510; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + + /* "_yaml.pyx":1511 + * self._serialize_node(item_key, node, None) + * self._serialize_node(item_value, node, item_key) + * yaml_mapping_end_event_initialize(&event) # <<<<<<<<<<<<<< + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + */ + yaml_mapping_end_event_initialize((&__pyx_v_event)); + + /* "_yaml.pyx":1512 + * self._serialize_node(item_value, node, item_key) + * yaml_mapping_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: # <<<<<<<<<<<<<< + * error = self._emitter_error() + * raise error + */ + __pyx_t_4 = yaml_emitter_emit((&__pyx_v_self->emitter), (&__pyx_v_event)); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_8 = ((__pyx_t_4 == 0) != 0); + if (__pyx_t_8) { + + /* "_yaml.pyx":1513 + * yaml_mapping_end_event_initialize(&event) + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() # <<<<<<<<<<<<<< + * raise error + * self.ascend_resolver() + */ + __pyx_t_5 = ((struct __pyx_vtabstruct_5_yaml_CEmitter *)__pyx_v_self->__pyx_vtab)->_emitter_error(__pyx_v_self); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1513; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_v_error = __pyx_t_5; + __pyx_t_5 = 0; + + /* "_yaml.pyx":1514 + * if yaml_emitter_emit(&self.emitter, &event) == 0: + * error = self._emitter_error() + * raise error # <<<<<<<<<<<<<< + * self.ascend_resolver() + * return 1 + */ + __Pyx_Raise(__pyx_v_error, 0, 0, 0); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1514; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + goto __pyx_L10; + } + __pyx_L10:; + + /* "_yaml.pyx":1515 + * error = self._emitter_error() + * raise error + * self.ascend_resolver() # <<<<<<<<<<<<<< + * return 1 + * + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_ascend_resolver); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1515; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1515; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_L7:; + + /* "_yaml.pyx":1516 + * raise error + * self.ascend_resolver() + * return 1 # <<<<<<<<<<<<<< + * + * cdef int output_handler(void *data, char *buffer, int size) except 0: + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":1374 + * return 1 + * + * cdef int _serialize_node(self, object node, object parent, object index) except 0: # <<<<<<<<<<<<<< + * cdef yaml_event_t event + * cdef int implicit + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("_yaml.CEmitter._serialize_node", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_anchor_object); + __Pyx_XDECREF(__pyx_v_error); + __Pyx_XDECREF(__pyx_v_node_class); + __Pyx_XDECREF(__pyx_v_tag_object); + __Pyx_XDECREF(__pyx_v_value_object); + __Pyx_XDECREF(__pyx_v_style_object); + __Pyx_XDECREF(__pyx_v_item); + __Pyx_XDECREF(__pyx_v_item_key); + __Pyx_XDECREF(__pyx_v_item_value); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "_yaml.pyx":1518 + * return 1 + * + * cdef int output_handler(void *data, char *buffer, int size) except 0: # <<<<<<<<<<<<<< + * cdef CEmitter emitter + * emitter = data + */ + +static int __pyx_f_5_yaml_output_handler(void *__pyx_v_data, char *__pyx_v_buffer, int __pyx_v_size) { + struct __pyx_obj_5_yaml_CEmitter *__pyx_v_emitter = 0; + PyObject *__pyx_v_value = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("output_handler", 0); + + /* "_yaml.pyx":1520 + * cdef int output_handler(void *data, char *buffer, int size) except 0: + * cdef CEmitter emitter + * emitter = data # <<<<<<<<<<<<<< + * if emitter.dump_unicode == 0: + * value = PyString_FromStringAndSize(buffer, size) + */ + __pyx_t_1 = ((PyObject *)__pyx_v_data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_emitter = ((struct __pyx_obj_5_yaml_CEmitter *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "_yaml.pyx":1521 + * cdef CEmitter emitter + * emitter = data + * if emitter.dump_unicode == 0: # <<<<<<<<<<<<<< + * value = PyString_FromStringAndSize(buffer, size) + * else: + */ + __pyx_t_2 = ((__pyx_v_emitter->dump_unicode == 0) != 0); + if (__pyx_t_2) { + + /* "_yaml.pyx":1522 + * emitter = data + * if emitter.dump_unicode == 0: + * value = PyString_FromStringAndSize(buffer, size) # <<<<<<<<<<<<<< + * else: + * value = PyUnicode_DecodeUTF8(buffer, size, 'strict') + */ + __pyx_t_1 = PyString_FromStringAndSize(__pyx_v_buffer, __pyx_v_size); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1522; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_value = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L3; + } + /*else*/ { + + /* "_yaml.pyx":1524 + * value = PyString_FromStringAndSize(buffer, size) + * else: + * value = PyUnicode_DecodeUTF8(buffer, size, 'strict') # <<<<<<<<<<<<<< + * emitter.stream.write(value) + * return 1 + */ + __pyx_t_1 = PyUnicode_DecodeUTF8(__pyx_v_buffer, __pyx_v_size, __pyx_k_strict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1524; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_value = __pyx_t_1; + __pyx_t_1 = 0; + } + __pyx_L3:; + + /* "_yaml.pyx":1525 + * else: + * value = PyUnicode_DecodeUTF8(buffer, size, 'strict') + * emitter.stream.write(value) # <<<<<<<<<<<<<< + * return 1 + * + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_emitter->stream, __pyx_n_s_write); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1525; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + + /* "_yaml.pyx":1526 + * value = PyUnicode_DecodeUTF8(buffer, size, 'strict') + * emitter.stream.write(value) + * return 1 # <<<<<<<<<<<<<< + * + */ + __pyx_r = 1; + goto __pyx_L0; + + /* "_yaml.pyx":1518 + * return 1 + * + * cdef int output_handler(void *data, char *buffer, int size) except 0: # <<<<<<<<<<<<<< + * cdef CEmitter emitter + * emitter = data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("_yaml.output_handler", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_emitter); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_tp_new_5_yaml_Mark(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_5_yaml_Mark *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_5_yaml_Mark *)o); + p->name = Py_None; Py_INCREF(Py_None); + p->buffer = Py_None; Py_INCREF(Py_None); + p->pointer = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_5_yaml_Mark(PyObject *o) { + struct __pyx_obj_5_yaml_Mark *p = (struct __pyx_obj_5_yaml_Mark *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->name); + Py_CLEAR(p->buffer); + Py_CLEAR(p->pointer); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_5_yaml_Mark(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_5_yaml_Mark *p = (struct __pyx_obj_5_yaml_Mark *)o; + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + if (p->buffer) { + e = (*v)(p->buffer, a); if (e) return e; + } + if (p->pointer) { + e = (*v)(p->pointer, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_5_yaml_Mark(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_5_yaml_Mark *p = (struct __pyx_obj_5_yaml_Mark *)o; + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->buffer); + p->buffer = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->pointer); + p->pointer = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_name(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_4name_1__get__(o); +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_index(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_5index_1__get__(o); +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_line(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_4line_1__get__(o); +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_column(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_6column_1__get__(o); +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_buffer(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_6buffer_1__get__(o); +} + +static PyObject *__pyx_getprop_5_yaml_4Mark_pointer(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_5_yaml_4Mark_7pointer_1__get__(o); +} + +static PyMethodDef __pyx_methods_5_yaml_Mark[] = { + {__Pyx_NAMESTR("get_snippet"), (PyCFunction)__pyx_pw_5_yaml_4Mark_3get_snippet, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_5_yaml_Mark[] = { + {(char *)"name", __pyx_getprop_5_yaml_4Mark_name, 0, 0, 0}, + {(char *)"index", __pyx_getprop_5_yaml_4Mark_index, 0, 0, 0}, + {(char *)"line", __pyx_getprop_5_yaml_4Mark_line, 0, 0, 0}, + {(char *)"column", __pyx_getprop_5_yaml_4Mark_column, 0, 0, 0}, + {(char *)"buffer", __pyx_getprop_5_yaml_4Mark_buffer, 0, 0, 0}, + {(char *)"pointer", __pyx_getprop_5_yaml_4Mark_pointer, 0, 0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_5_yaml_Mark = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("_yaml.Mark"), /*tp_name*/ + sizeof(struct __pyx_obj_5_yaml_Mark), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5_yaml_Mark, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #else + 0, /*reserved*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + __pyx_pw_5_yaml_4Mark_5__str__, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_5_yaml_Mark, /*tp_traverse*/ + __pyx_tp_clear_5_yaml_Mark, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_5_yaml_Mark, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_5_yaml_Mark, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_5_yaml_4Mark_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_5_yaml_Mark, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_5_yaml_CParser __pyx_vtable_5_yaml_CParser; + +static PyObject *__pyx_tp_new_5_yaml_CParser(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_5_yaml_CParser *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_5_yaml_CParser *)o); + p->__pyx_vtab = __pyx_vtabptr_5_yaml_CParser; + p->stream = Py_None; Py_INCREF(Py_None); + p->stream_name = Py_None; Py_INCREF(Py_None); + p->current_token = Py_None; Py_INCREF(Py_None); + p->current_event = Py_None; Py_INCREF(Py_None); + p->anchors = Py_None; Py_INCREF(Py_None); + p->stream_cache = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_5_yaml_CParser(PyObject *o) { + struct __pyx_obj_5_yaml_CParser *p = (struct __pyx_obj_5_yaml_CParser *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_5_yaml_7CParser_3__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->stream); + Py_CLEAR(p->stream_name); + Py_CLEAR(p->current_token); + Py_CLEAR(p->current_event); + Py_CLEAR(p->anchors); + Py_CLEAR(p->stream_cache); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_5_yaml_CParser(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_5_yaml_CParser *p = (struct __pyx_obj_5_yaml_CParser *)o; + if (p->stream) { + e = (*v)(p->stream, a); if (e) return e; + } + if (p->stream_name) { + e = (*v)(p->stream_name, a); if (e) return e; + } + if (p->current_token) { + e = (*v)(p->current_token, a); if (e) return e; + } + if (p->current_event) { + e = (*v)(p->current_event, a); if (e) return e; + } + if (p->anchors) { + e = (*v)(p->anchors, a); if (e) return e; + } + if (p->stream_cache) { + e = (*v)(p->stream_cache, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_5_yaml_CParser(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_5_yaml_CParser *p = (struct __pyx_obj_5_yaml_CParser *)o; + tmp = ((PyObject*)p->stream); + p->stream = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->stream_name); + p->stream_name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->current_token); + p->current_token = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->current_event); + p->current_event = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->anchors); + p->anchors = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->stream_cache); + p->stream_cache = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_5_yaml_CParser[] = { + {__Pyx_NAMESTR("dispose"), (PyCFunction)__pyx_pw_5_yaml_7CParser_5dispose, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("raw_scan"), (PyCFunction)__pyx_pw_5_yaml_7CParser_7raw_scan, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("get_token"), (PyCFunction)__pyx_pw_5_yaml_7CParser_9get_token, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("peek_token"), (PyCFunction)__pyx_pw_5_yaml_7CParser_11peek_token, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("check_token"), (PyCFunction)__pyx_pw_5_yaml_7CParser_13check_token, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("raw_parse"), (PyCFunction)__pyx_pw_5_yaml_7CParser_15raw_parse, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("get_event"), (PyCFunction)__pyx_pw_5_yaml_7CParser_17get_event, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("peek_event"), (PyCFunction)__pyx_pw_5_yaml_7CParser_19peek_event, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("check_event"), (PyCFunction)__pyx_pw_5_yaml_7CParser_21check_event, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("check_node"), (PyCFunction)__pyx_pw_5_yaml_7CParser_23check_node, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("get_node"), (PyCFunction)__pyx_pw_5_yaml_7CParser_25get_node, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("get_single_node"), (PyCFunction)__pyx_pw_5_yaml_7CParser_27get_single_node, METH_NOARGS, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_5_yaml_CParser = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("_yaml.CParser"), /*tp_name*/ + sizeof(struct __pyx_obj_5_yaml_CParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5_yaml_CParser, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #else + 0, /*reserved*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_5_yaml_CParser, /*tp_traverse*/ + __pyx_tp_clear_5_yaml_CParser, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_5_yaml_CParser, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_5_yaml_7CParser_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_5_yaml_CParser, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; +static struct __pyx_vtabstruct_5_yaml_CEmitter __pyx_vtable_5_yaml_CEmitter; + +static PyObject *__pyx_tp_new_5_yaml_CEmitter(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_5_yaml_CEmitter *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_5_yaml_CEmitter *)o); + p->__pyx_vtab = __pyx_vtabptr_5_yaml_CEmitter; + p->stream = Py_None; Py_INCREF(Py_None); + p->use_version = Py_None; Py_INCREF(Py_None); + p->use_tags = Py_None; Py_INCREF(Py_None); + p->serialized_nodes = Py_None; Py_INCREF(Py_None); + p->anchors = Py_None; Py_INCREF(Py_None); + p->use_encoding = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_5_yaml_CEmitter(PyObject *o) { + struct __pyx_obj_5_yaml_CEmitter *p = (struct __pyx_obj_5_yaml_CEmitter *)o; + #if PY_VERSION_HEX >= 0x030400a1 + if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + ++Py_REFCNT(o); + __pyx_pw_5_yaml_8CEmitter_3__dealloc__(o); + --Py_REFCNT(o); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->stream); + Py_CLEAR(p->use_version); + Py_CLEAR(p->use_tags); + Py_CLEAR(p->serialized_nodes); + Py_CLEAR(p->anchors); + Py_CLEAR(p->use_encoding); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_5_yaml_CEmitter(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_5_yaml_CEmitter *p = (struct __pyx_obj_5_yaml_CEmitter *)o; + if (p->stream) { + e = (*v)(p->stream, a); if (e) return e; + } + if (p->use_version) { + e = (*v)(p->use_version, a); if (e) return e; + } + if (p->use_tags) { + e = (*v)(p->use_tags, a); if (e) return e; + } + if (p->serialized_nodes) { + e = (*v)(p->serialized_nodes, a); if (e) return e; + } + if (p->anchors) { + e = (*v)(p->anchors, a); if (e) return e; + } + if (p->use_encoding) { + e = (*v)(p->use_encoding, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_5_yaml_CEmitter(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_5_yaml_CEmitter *p = (struct __pyx_obj_5_yaml_CEmitter *)o; + tmp = ((PyObject*)p->stream); + p->stream = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->use_version); + p->use_version = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->use_tags); + p->use_tags = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->serialized_nodes); + p->serialized_nodes = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->anchors); + p->anchors = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->use_encoding); + p->use_encoding = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyMethodDef __pyx_methods_5_yaml_CEmitter[] = { + {__Pyx_NAMESTR("dispose"), (PyCFunction)__pyx_pw_5_yaml_8CEmitter_5dispose, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("emit"), (PyCFunction)__pyx_pw_5_yaml_8CEmitter_7emit, METH_O, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("open"), (PyCFunction)__pyx_pw_5_yaml_8CEmitter_9open, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("close"), (PyCFunction)__pyx_pw_5_yaml_8CEmitter_11close, METH_NOARGS, __Pyx_DOCSTR(0)}, + {__Pyx_NAMESTR("serialize"), (PyCFunction)__pyx_pw_5_yaml_8CEmitter_13serialize, METH_O, __Pyx_DOCSTR(0)}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_5_yaml_CEmitter = { + PyVarObject_HEAD_INIT(0, 0) + __Pyx_NAMESTR("_yaml.CEmitter"), /*tp_name*/ + sizeof(struct __pyx_obj_5_yaml_CEmitter), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_5_yaml_CEmitter, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #else + 0, /*reserved*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_5_yaml_CEmitter, /*tp_traverse*/ + __pyx_tp_clear_5_yaml_CEmitter, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_5_yaml_CEmitter, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_5_yaml_8CEmitter_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_5_yaml_CEmitter, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + #if PY_VERSION_HEX >= 0x02060000 + 0, /*tp_version_tag*/ + #endif + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + __Pyx_NAMESTR("_yaml"), + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_AliasEvent, __pyx_k_AliasEvent, sizeof(__pyx_k_AliasEvent), 0, 0, 1, 1}, + {&__pyx_n_s_AliasToken, __pyx_k_AliasToken, sizeof(__pyx_k_AliasToken), 0, 0, 1, 1}, + {&__pyx_n_s_AnchorToken, __pyx_k_AnchorToken, sizeof(__pyx_k_AnchorToken), 0, 0, 1, 1}, + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_n_s_BlockEndToken, __pyx_k_BlockEndToken, sizeof(__pyx_k_BlockEndToken), 0, 0, 1, 1}, + {&__pyx_n_s_BlockEntryToken, __pyx_k_BlockEntryToken, sizeof(__pyx_k_BlockEntryToken), 0, 0, 1, 1}, + {&__pyx_n_s_BlockMappingStartToken, __pyx_k_BlockMappingStartToken, sizeof(__pyx_k_BlockMappingStartToken), 0, 0, 1, 1}, + {&__pyx_n_s_BlockSequenceStartToken, __pyx_k_BlockSequenceStartToken, sizeof(__pyx_k_BlockSequenceStartToken), 0, 0, 1, 1}, + {&__pyx_n_s_ComposerError, __pyx_k_ComposerError, sizeof(__pyx_k_ComposerError), 0, 0, 1, 1}, + {&__pyx_n_s_ConstructorError, __pyx_k_ConstructorError, sizeof(__pyx_k_ConstructorError), 0, 0, 1, 1}, + {&__pyx_n_s_DirectiveToken, __pyx_k_DirectiveToken, sizeof(__pyx_k_DirectiveToken), 0, 0, 1, 1}, + {&__pyx_n_s_DocumentEndEvent, __pyx_k_DocumentEndEvent, sizeof(__pyx_k_DocumentEndEvent), 0, 0, 1, 1}, + {&__pyx_n_s_DocumentEndToken, __pyx_k_DocumentEndToken, sizeof(__pyx_k_DocumentEndToken), 0, 0, 1, 1}, + {&__pyx_n_s_DocumentStartEvent, __pyx_k_DocumentStartEvent, sizeof(__pyx_k_DocumentStartEvent), 0, 0, 1, 1}, + {&__pyx_n_s_DocumentStartToken, __pyx_k_DocumentStartToken, sizeof(__pyx_k_DocumentStartToken), 0, 0, 1, 1}, + {&__pyx_n_s_EmitterError, __pyx_k_EmitterError, sizeof(__pyx_k_EmitterError), 0, 0, 1, 1}, + {&__pyx_n_s_FlowEntryToken, __pyx_k_FlowEntryToken, sizeof(__pyx_k_FlowEntryToken), 0, 0, 1, 1}, + {&__pyx_n_s_FlowMappingEndToken, __pyx_k_FlowMappingEndToken, sizeof(__pyx_k_FlowMappingEndToken), 0, 0, 1, 1}, + {&__pyx_n_s_FlowMappingStartToken, __pyx_k_FlowMappingStartToken, sizeof(__pyx_k_FlowMappingStartToken), 0, 0, 1, 1}, + {&__pyx_n_s_FlowSequenceEndToken, __pyx_k_FlowSequenceEndToken, sizeof(__pyx_k_FlowSequenceEndToken), 0, 0, 1, 1}, + {&__pyx_n_s_FlowSequenceStartToken, __pyx_k_FlowSequenceStartToken, sizeof(__pyx_k_FlowSequenceStartToken), 0, 0, 1, 1}, + {&__pyx_n_s_KeyToken, __pyx_k_KeyToken, sizeof(__pyx_k_KeyToken), 0, 0, 1, 1}, + {&__pyx_n_s_MappingEndEvent, __pyx_k_MappingEndEvent, sizeof(__pyx_k_MappingEndEvent), 0, 0, 1, 1}, + {&__pyx_n_s_MappingNode, __pyx_k_MappingNode, sizeof(__pyx_k_MappingNode), 0, 0, 1, 1}, + {&__pyx_n_s_MappingStartEvent, __pyx_k_MappingStartEvent, sizeof(__pyx_k_MappingStartEvent), 0, 0, 1, 1}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_n_s_ParserError, __pyx_k_ParserError, sizeof(__pyx_k_ParserError), 0, 0, 1, 1}, + {&__pyx_n_s_ReaderError, __pyx_k_ReaderError, sizeof(__pyx_k_ReaderError), 0, 0, 1, 1}, + {&__pyx_n_s_RepresenterError, __pyx_k_RepresenterError, sizeof(__pyx_k_RepresenterError), 0, 0, 1, 1}, + {&__pyx_n_s_ScalarEvent, __pyx_k_ScalarEvent, sizeof(__pyx_k_ScalarEvent), 0, 0, 1, 1}, + {&__pyx_n_s_ScalarNode, __pyx_k_ScalarNode, sizeof(__pyx_k_ScalarNode), 0, 0, 1, 1}, + {&__pyx_n_s_ScalarToken, __pyx_k_ScalarToken, sizeof(__pyx_k_ScalarToken), 0, 0, 1, 1}, + {&__pyx_n_s_ScannerError, __pyx_k_ScannerError, sizeof(__pyx_k_ScannerError), 0, 0, 1, 1}, + {&__pyx_n_s_SequenceEndEvent, __pyx_k_SequenceEndEvent, sizeof(__pyx_k_SequenceEndEvent), 0, 0, 1, 1}, + {&__pyx_n_s_SequenceNode, __pyx_k_SequenceNode, sizeof(__pyx_k_SequenceNode), 0, 0, 1, 1}, + {&__pyx_n_s_SequenceStartEvent, __pyx_k_SequenceStartEvent, sizeof(__pyx_k_SequenceStartEvent), 0, 0, 1, 1}, + {&__pyx_n_s_SerializerError, __pyx_k_SerializerError, sizeof(__pyx_k_SerializerError), 0, 0, 1, 1}, + {&__pyx_n_s_StreamEndEvent, __pyx_k_StreamEndEvent, sizeof(__pyx_k_StreamEndEvent), 0, 0, 1, 1}, + {&__pyx_n_s_StreamEndToken, __pyx_k_StreamEndToken, sizeof(__pyx_k_StreamEndToken), 0, 0, 1, 1}, + {&__pyx_n_s_StreamStartEvent, __pyx_k_StreamStartEvent, sizeof(__pyx_k_StreamStartEvent), 0, 0, 1, 1}, + {&__pyx_n_s_StreamStartToken, __pyx_k_StreamStartToken, sizeof(__pyx_k_StreamStartToken), 0, 0, 1, 1}, + {&__pyx_n_u_TAG, __pyx_k_TAG, sizeof(__pyx_k_TAG), 0, 1, 0, 1}, + {&__pyx_n_s_TagToken, __pyx_k_TagToken, sizeof(__pyx_k_TagToken), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueToken, __pyx_k_ValueToken, sizeof(__pyx_k_ValueToken), 0, 0, 1, 1}, + {&__pyx_n_u_YAML, __pyx_k_YAML, sizeof(__pyx_k_YAML), 0, 1, 0, 1}, + {&__pyx_n_s_YAMLError, __pyx_k_YAMLError, sizeof(__pyx_k_YAMLError), 0, 0, 1, 1}, + {&__pyx_kp_s__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 0, 1, 0}, + {&__pyx_kp_u__10, __pyx_k__10, sizeof(__pyx_k__10), 0, 1, 0, 0}, + {&__pyx_kp_s__17, __pyx_k__17, sizeof(__pyx_k__17), 0, 0, 1, 0}, + {&__pyx_kp_s__18, __pyx_k__18, sizeof(__pyx_k__18), 0, 0, 1, 0}, + {&__pyx_kp_s__19, __pyx_k__19, sizeof(__pyx_k__19), 0, 0, 1, 0}, + {&__pyx_kp_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 0}, + {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, + {&__pyx_kp_u__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 1, 0, 0}, + {&__pyx_kp_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_kp_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 0}, + {&__pyx_kp_u__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 1, 0, 0}, + {&__pyx_kp_s__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 0, 1, 0}, + {&__pyx_kp_u__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 1, 0, 0}, + {&__pyx_kp_s_a_string_or_stream_input_is_requ, __pyx_k_a_string_or_stream_input_is_requ, sizeof(__pyx_k_a_string_or_stream_input_is_requ), 0, 0, 1, 0}, + {&__pyx_kp_u_a_string_or_stream_input_is_requ, __pyx_k_a_string_or_stream_input_is_requ, sizeof(__pyx_k_a_string_or_stream_input_is_requ), 0, 1, 0, 0}, + {&__pyx_kp_s_a_string_value_is_expected, __pyx_k_a_string_value_is_expected, sizeof(__pyx_k_a_string_value_is_expected), 0, 0, 1, 0}, + {&__pyx_kp_u_a_string_value_is_expected, __pyx_k_a_string_value_is_expected, sizeof(__pyx_k_a_string_value_is_expected), 0, 1, 0, 0}, + {&__pyx_n_s_allow_unicode, __pyx_k_allow_unicode, sizeof(__pyx_k_allow_unicode), 0, 0, 1, 1}, + {&__pyx_n_s_anchor, __pyx_k_anchor, sizeof(__pyx_k_anchor), 0, 0, 1, 1}, + {&__pyx_kp_s_anchor_must_be_a_string, __pyx_k_anchor_must_be_a_string, sizeof(__pyx_k_anchor_must_be_a_string), 0, 0, 1, 0}, + {&__pyx_kp_u_anchor_must_be_a_string, __pyx_k_anchor_must_be_a_string, sizeof(__pyx_k_anchor_must_be_a_string), 0, 1, 0, 0}, + {&__pyx_n_s_ascend_resolver, __pyx_k_ascend_resolver, sizeof(__pyx_k_ascend_resolver), 0, 0, 1, 1}, + {&__pyx_n_s_buffer, __pyx_k_buffer, sizeof(__pyx_k_buffer), 0, 0, 1, 1}, + {&__pyx_kp_s_but_found_another_document, __pyx_k_but_found_another_document, sizeof(__pyx_k_but_found_another_document), 0, 0, 1, 0}, + {&__pyx_kp_u_but_found_another_document, __pyx_k_but_found_another_document, sizeof(__pyx_k_but_found_another_document), 0, 1, 0, 0}, + {&__pyx_kp_s_byte_string, __pyx_k_byte_string, sizeof(__pyx_k_byte_string), 0, 0, 1, 0}, + {&__pyx_kp_u_byte_string, __pyx_k_byte_string, sizeof(__pyx_k_byte_string), 0, 1, 0, 0}, + {&__pyx_n_s_canonical, __pyx_k_canonical, sizeof(__pyx_k_canonical), 0, 0, 1, 1}, + {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1}, + {&__pyx_n_s_column, __pyx_k_column, sizeof(__pyx_k_column), 0, 0, 1, 1}, + {&__pyx_n_s_composer, __pyx_k_composer, sizeof(__pyx_k_composer), 0, 0, 1, 1}, + {&__pyx_n_s_constructor, __pyx_k_constructor, sizeof(__pyx_k_constructor), 0, 0, 1, 1}, + {&__pyx_n_s_descend_resolver, __pyx_k_descend_resolver, sizeof(__pyx_k_descend_resolver), 0, 0, 1, 1}, + {&__pyx_n_s_emitter, __pyx_k_emitter, sizeof(__pyx_k_emitter), 0, 0, 1, 1}, + {&__pyx_n_s_encoding, __pyx_k_encoding, sizeof(__pyx_k_encoding), 0, 0, 1, 1}, + {&__pyx_n_u_encoding, __pyx_k_encoding, sizeof(__pyx_k_encoding), 0, 1, 0, 1}, + {&__pyx_n_s_end_mark, __pyx_k_end_mark, sizeof(__pyx_k_end_mark), 0, 0, 1, 1}, + {&__pyx_n_s_error, __pyx_k_error, sizeof(__pyx_k_error), 0, 0, 1, 1}, + {&__pyx_n_s_events, __pyx_k_events, sizeof(__pyx_k_events), 0, 0, 1, 1}, + {&__pyx_kp_s_expected_a_single_document_in_th, __pyx_k_expected_a_single_document_in_th, sizeof(__pyx_k_expected_a_single_document_in_th), 0, 0, 1, 0}, + {&__pyx_kp_u_expected_a_single_document_in_th, __pyx_k_expected_a_single_document_in_th, sizeof(__pyx_k_expected_a_single_document_in_th), 0, 1, 0, 0}, + {&__pyx_n_s_explicit, __pyx_k_explicit, sizeof(__pyx_k_explicit), 0, 0, 1, 1}, + {&__pyx_n_s_explicit_end, __pyx_k_explicit_end, sizeof(__pyx_k_explicit_end), 0, 0, 1, 1}, + {&__pyx_n_s_explicit_start, __pyx_k_explicit_start, sizeof(__pyx_k_explicit_start), 0, 0, 1, 1}, + {&__pyx_kp_s_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 0, 1, 0}, + {&__pyx_kp_u_file, __pyx_k_file, sizeof(__pyx_k_file), 0, 1, 0, 0}, + {&__pyx_n_s_flow_style, __pyx_k_flow_style, sizeof(__pyx_k_flow_style), 0, 0, 1, 1}, + {&__pyx_kp_s_found_duplicate_anchor_first_occ, __pyx_k_found_duplicate_anchor_first_occ, sizeof(__pyx_k_found_duplicate_anchor_first_occ), 0, 0, 1, 0}, + {&__pyx_kp_u_found_duplicate_anchor_first_occ, __pyx_k_found_duplicate_anchor_first_occ, sizeof(__pyx_k_found_duplicate_anchor_first_occ), 0, 1, 0, 0}, + {&__pyx_kp_s_found_undefined_alias, __pyx_k_found_undefined_alias, sizeof(__pyx_k_found_undefined_alias), 0, 0, 1, 0}, + {&__pyx_kp_u_found_undefined_alias, __pyx_k_found_undefined_alias, sizeof(__pyx_k_found_undefined_alias), 0, 1, 0, 0}, + {&__pyx_n_s_get_version, __pyx_k_get_version, sizeof(__pyx_k_get_version), 0, 0, 1, 1}, + {&__pyx_n_s_get_version_string, __pyx_k_get_version_string, sizeof(__pyx_k_get_version_string), 0, 0, 1, 1}, + {&__pyx_kp_u_id_03d, __pyx_k_id_03d, sizeof(__pyx_k_id_03d), 0, 1, 0, 0}, + {&__pyx_n_s_implicit, __pyx_k_implicit, sizeof(__pyx_k_implicit), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_kp_s_in_s_line_d_column_d, __pyx_k_in_s_line_d_column_d, sizeof(__pyx_k_in_s_line_d_column_d), 0, 0, 1, 0}, + {&__pyx_n_s_indent, __pyx_k_indent, sizeof(__pyx_k_indent), 0, 0, 1, 1}, + {&__pyx_n_s_index, __pyx_k_index, sizeof(__pyx_k_index), 0, 0, 1, 1}, + {&__pyx_kp_s_invalid_event_s, __pyx_k_invalid_event_s, sizeof(__pyx_k_invalid_event_s), 0, 0, 1, 0}, + {&__pyx_kp_u_invalid_event_s, __pyx_k_invalid_event_s, sizeof(__pyx_k_invalid_event_s), 0, 1, 0, 0}, + {&__pyx_n_s_line, __pyx_k_line, sizeof(__pyx_k_line), 0, 0, 1, 1}, + {&__pyx_n_s_line_break, __pyx_k_line_break, sizeof(__pyx_k_line_break), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_major, __pyx_k_major, sizeof(__pyx_k_major), 0, 0, 1, 1}, + {&__pyx_n_s_minor, __pyx_k_minor, sizeof(__pyx_k_minor), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_kp_s_no_emitter_error, __pyx_k_no_emitter_error, sizeof(__pyx_k_no_emitter_error), 0, 0, 1, 0}, + {&__pyx_kp_u_no_emitter_error, __pyx_k_no_emitter_error, sizeof(__pyx_k_no_emitter_error), 0, 1, 0, 0}, + {&__pyx_kp_s_no_parser_error, __pyx_k_no_parser_error, sizeof(__pyx_k_no_parser_error), 0, 0, 1, 0}, + {&__pyx_kp_u_no_parser_error, __pyx_k_no_parser_error, sizeof(__pyx_k_no_parser_error), 0, 1, 0, 0}, + {&__pyx_n_s_nodes, __pyx_k_nodes, sizeof(__pyx_k_nodes), 0, 0, 1, 1}, + {&__pyx_n_s_parser, __pyx_k_parser, sizeof(__pyx_k_parser), 0, 0, 1, 1}, + {&__pyx_n_s_patch, __pyx_k_patch, sizeof(__pyx_k_patch), 0, 0, 1, 1}, + {&__pyx_n_s_pointer, __pyx_k_pointer, sizeof(__pyx_k_pointer), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_read, __pyx_k_read, sizeof(__pyx_k_read), 0, 0, 1, 1}, + {&__pyx_n_s_reader, __pyx_k_reader, sizeof(__pyx_k_reader), 0, 0, 1, 1}, + {&__pyx_n_s_representer, __pyx_k_representer, sizeof(__pyx_k_representer), 0, 0, 1, 1}, + {&__pyx_n_s_resolve, __pyx_k_resolve, sizeof(__pyx_k_resolve), 0, 0, 1, 1}, + {&__pyx_kp_s_root_src_pyyaml_ext__yaml_pyx, __pyx_k_root_src_pyyaml_ext__yaml_pyx, sizeof(__pyx_k_root_src_pyyaml_ext__yaml_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_scanner, __pyx_k_scanner, sizeof(__pyx_k_scanner), 0, 0, 1, 1}, + {&__pyx_kp_s_second_occurence, __pyx_k_second_occurence, sizeof(__pyx_k_second_occurence), 0, 0, 1, 0}, + {&__pyx_kp_u_second_occurence, __pyx_k_second_occurence, sizeof(__pyx_k_second_occurence), 0, 1, 0, 0}, + {&__pyx_n_s_serializer, __pyx_k_serializer, sizeof(__pyx_k_serializer), 0, 0, 1, 1}, + {&__pyx_kp_s_serializer_is_already_opened, __pyx_k_serializer_is_already_opened, sizeof(__pyx_k_serializer_is_already_opened), 0, 0, 1, 0}, + {&__pyx_kp_u_serializer_is_already_opened, __pyx_k_serializer_is_already_opened, sizeof(__pyx_k_serializer_is_already_opened), 0, 1, 0, 0}, + {&__pyx_kp_s_serializer_is_closed, __pyx_k_serializer_is_closed, sizeof(__pyx_k_serializer_is_closed), 0, 0, 1, 0}, + {&__pyx_kp_u_serializer_is_closed, __pyx_k_serializer_is_closed, sizeof(__pyx_k_serializer_is_closed), 0, 1, 0, 0}, + {&__pyx_kp_s_serializer_is_not_opened, __pyx_k_serializer_is_not_opened, sizeof(__pyx_k_serializer_is_not_opened), 0, 0, 1, 0}, + {&__pyx_kp_u_serializer_is_not_opened, __pyx_k_serializer_is_not_opened, sizeof(__pyx_k_serializer_is_not_opened), 0, 1, 0, 0}, + {&__pyx_n_s_start_mark, __pyx_k_start_mark, sizeof(__pyx_k_start_mark), 0, 0, 1, 1}, + {&__pyx_n_s_stream, __pyx_k_stream, sizeof(__pyx_k_stream), 0, 0, 1, 1}, + {&__pyx_n_s_style, __pyx_k_style, sizeof(__pyx_k_style), 0, 0, 1, 1}, + {&__pyx_n_s_tag, __pyx_k_tag, sizeof(__pyx_k_tag), 0, 0, 1, 1}, + {&__pyx_kp_s_tag_handle_must_be_a_string, __pyx_k_tag_handle_must_be_a_string, sizeof(__pyx_k_tag_handle_must_be_a_string), 0, 0, 1, 0}, + {&__pyx_kp_u_tag_handle_must_be_a_string, __pyx_k_tag_handle_must_be_a_string, sizeof(__pyx_k_tag_handle_must_be_a_string), 0, 1, 0, 0}, + {&__pyx_kp_s_tag_must_be_a_string, __pyx_k_tag_must_be_a_string, sizeof(__pyx_k_tag_must_be_a_string), 0, 0, 1, 0}, + {&__pyx_kp_u_tag_must_be_a_string, __pyx_k_tag_must_be_a_string, sizeof(__pyx_k_tag_must_be_a_string), 0, 1, 0, 0}, + {&__pyx_kp_s_tag_prefix_must_be_a_string, __pyx_k_tag_prefix_must_be_a_string, sizeof(__pyx_k_tag_prefix_must_be_a_string), 0, 0, 1, 0}, + {&__pyx_kp_u_tag_prefix_must_be_a_string, __pyx_k_tag_prefix_must_be_a_string, sizeof(__pyx_k_tag_prefix_must_be_a_string), 0, 1, 0, 0}, + {&__pyx_n_s_tags, __pyx_k_tags, sizeof(__pyx_k_tags), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_tokens, __pyx_k_tokens, sizeof(__pyx_k_tokens), 0, 0, 1, 1}, + {&__pyx_kp_s_too_many_tags, __pyx_k_too_many_tags, sizeof(__pyx_k_too_many_tags), 0, 0, 1, 0}, + {&__pyx_kp_u_too_many_tags, __pyx_k_too_many_tags, sizeof(__pyx_k_too_many_tags), 0, 1, 0, 0}, + {&__pyx_kp_s_unicode_string, __pyx_k_unicode_string, sizeof(__pyx_k_unicode_string), 0, 0, 1, 0}, + {&__pyx_kp_u_unicode_string, __pyx_k_unicode_string, sizeof(__pyx_k_unicode_string), 0, 1, 0, 0}, + {&__pyx_kp_s_unknown_event_type, __pyx_k_unknown_event_type, sizeof(__pyx_k_unknown_event_type), 0, 0, 1, 0}, + {&__pyx_kp_u_unknown_event_type, __pyx_k_unknown_event_type, sizeof(__pyx_k_unknown_event_type), 0, 1, 0, 0}, + {&__pyx_kp_s_unknown_token_type, __pyx_k_unknown_token_type, sizeof(__pyx_k_unknown_token_type), 0, 0, 1, 0}, + {&__pyx_kp_u_unknown_token_type, __pyx_k_unknown_token_type, sizeof(__pyx_k_unknown_token_type), 0, 1, 0, 0}, + {&__pyx_kp_s_utf_16_be, __pyx_k_utf_16_be, sizeof(__pyx_k_utf_16_be), 0, 0, 1, 0}, + {&__pyx_kp_u_utf_16_be, __pyx_k_utf_16_be, sizeof(__pyx_k_utf_16_be), 0, 1, 0, 0}, + {&__pyx_kp_s_utf_16_le, __pyx_k_utf_16_le, sizeof(__pyx_k_utf_16_le), 0, 0, 1, 0}, + {&__pyx_kp_u_utf_16_le, __pyx_k_utf_16_le, sizeof(__pyx_k_utf_16_le), 0, 1, 0, 0}, + {&__pyx_kp_u_utf_8, __pyx_k_utf_8, sizeof(__pyx_k_utf_8), 0, 1, 0, 0}, + {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1}, + {&__pyx_kp_s_value_must_be_a_string, __pyx_k_value_must_be_a_string, sizeof(__pyx_k_value_must_be_a_string), 0, 0, 1, 0}, + {&__pyx_kp_u_value_must_be_a_string, __pyx_k_value_must_be_a_string, sizeof(__pyx_k_value_must_be_a_string), 0, 1, 0, 0}, + {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, + {&__pyx_n_s_width, __pyx_k_width, sizeof(__pyx_k_width), 0, 0, 1, 1}, + {&__pyx_n_s_write, __pyx_k_write, sizeof(__pyx_k_write), 0, 0, 1, 1}, + {&__pyx_n_s_yaml, __pyx_k_yaml, sizeof(__pyx_k_yaml), 0, 0, 1, 1}, + {&__pyx_n_s_yaml_2, __pyx_k_yaml_2, sizeof(__pyx_k_yaml_2), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "_yaml.pyx":301 + * if PyString_CheckExact(stream) == 0: + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string or stream input is required") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"a string or stream input is required") + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_a_string_or_stream_input_is_requ); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "_yaml.pyx":303 + * raise TypeError("a string or stream input is required") + * else: + * raise TypeError(u"a string or stream input is required") # <<<<<<<<<<<<<< + * self.stream = stream + * yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_a_string_or_stream_input_is_requ); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "_yaml.pyx":356 + * return ParserError(context, context_mark, problem, problem_mark) + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no parser error") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"no parser error") + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_no_parser_error); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "_yaml.pyx":358 + * raise ValueError("no parser error") + * else: + * raise ValueError(u"no parser error") # <<<<<<<<<<<<<< + * + * def raw_scan(self): + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_no_parser_error); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "_yaml.pyx":479 + * else: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("unknown token type") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown token type") + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_unknown_token_type); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "_yaml.pyx":481 + * raise ValueError("unknown token type") + * else: + * raise ValueError(u"unknown token type") # <<<<<<<<<<<<<< + * + * def get_token(self): + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_u_unknown_token_type); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "_yaml.pyx":657 + * else: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("unknown event type") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown event type") + */ + __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_unknown_event_type); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 657; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "_yaml.pyx":659 + * raise ValueError("unknown event type") + * else: + * raise ValueError(u"unknown event type") # <<<<<<<<<<<<<< + * + * def get_event(self): + */ + __pyx_tuple__14 = PyTuple_Pack(1, __pyx_kp_u_unknown_event_type); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 659; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + + /* "_yaml.pyx":918 + * if PyString_CheckExact(value) == 0: + * if PY_MAJOR_VERSION < 3: + * raise TypeError("a string value is expected") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"a string value is expected") + */ + __pyx_tuple__15 = PyTuple_Pack(1, __pyx_kp_s_a_string_value_is_expected); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 918; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__15); + __Pyx_GIVEREF(__pyx_tuple__15); + + /* "_yaml.pyx":920 + * raise TypeError("a string value is expected") + * else: + * raise TypeError(u"a string value is expected") # <<<<<<<<<<<<<< + * parser.stream_cache = value + * parser.stream_cache_pos = 0 + */ + __pyx_tuple__16 = PyTuple_Pack(1, __pyx_kp_u_a_string_value_is_expected); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + + /* "_yaml.pyx":1012 + * return EmitterError(problem) + * if PY_MAJOR_VERSION < 3: + * raise ValueError("no emitter error") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"no emitter error") + */ + __pyx_tuple__20 = PyTuple_Pack(1, __pyx_kp_s_no_emitter_error); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__20); + __Pyx_GIVEREF(__pyx_tuple__20); + + /* "_yaml.pyx":1014 + * raise ValueError("no emitter error") + * else: + * raise ValueError(u"no emitter error") # <<<<<<<<<<<<<< + * + * cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0: + */ + __pyx_tuple__21 = PyTuple_Pack(1, __pyx_kp_u_no_emitter_error); if (unlikely(!__pyx_tuple__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__21); + __Pyx_GIVEREF(__pyx_tuple__21); + + /* "_yaml.pyx":1058 + * if len(event_object.tags) > 128: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"too many tags") + */ + __pyx_tuple__22 = PyTuple_Pack(1, __pyx_kp_s_too_many_tags); if (unlikely(!__pyx_tuple__22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1058; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__22); + __Pyx_GIVEREF(__pyx_tuple__22); + + /* "_yaml.pyx":1060 + * raise ValueError("too many tags") + * else: + * raise ValueError(u"too many tags") # <<<<<<<<<<<<<< + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + */ + __pyx_tuple__23 = PyTuple_Pack(1, __pyx_kp_u_too_many_tags); if (unlikely(!__pyx_tuple__23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1060; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__23); + __Pyx_GIVEREF(__pyx_tuple__23); + + /* "_yaml.pyx":1071 + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag handle must be a string") + */ + __pyx_tuple__24 = PyTuple_Pack(1, __pyx_kp_s_tag_handle_must_be_a_string); if (unlikely(!__pyx_tuple__24)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__24); + __Pyx_GIVEREF(__pyx_tuple__24); + + /* "_yaml.pyx":1073 + * raise TypeError("tag handle must be a string") + * else: + * raise TypeError(u"tag handle must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + */ + __pyx_tuple__25 = PyTuple_Pack(1, __pyx_kp_u_tag_handle_must_be_a_string); if (unlikely(!__pyx_tuple__25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1073; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__25); + __Pyx_GIVEREF(__pyx_tuple__25); + + /* "_yaml.pyx":1080 + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag prefix must be a string") + */ + __pyx_tuple__26 = PyTuple_Pack(1, __pyx_kp_s_tag_prefix_must_be_a_string); if (unlikely(!__pyx_tuple__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__26); + __Pyx_GIVEREF(__pyx_tuple__26); + + /* "_yaml.pyx":1082 + * raise TypeError("tag prefix must be a string") + * else: + * raise TypeError(u"tag prefix must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 + */ + __pyx_tuple__27 = PyTuple_Pack(1, __pyx_kp_u_tag_prefix_must_be_a_string); if (unlikely(!__pyx_tuple__27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__27); + __Pyx_GIVEREF(__pyx_tuple__27); + + /* "_yaml.pyx":1103 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_tuple__28 = PyTuple_Pack(1, __pyx_kp_s_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1103; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__28); + __Pyx_GIVEREF(__pyx_tuple__28); + + /* "_yaml.pyx":1105 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * if yaml_alias_event_initialize(event, anchor) == 0: + */ + __pyx_tuple__29 = PyTuple_Pack(1, __pyx_kp_u_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__29)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__29); + __Pyx_GIVEREF(__pyx_tuple__29); + + /* "_yaml.pyx":1117 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_tuple__30 = PyTuple_Pack(1, __pyx_kp_s_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__30); + __Pyx_GIVEREF(__pyx_tuple__30); + + /* "_yaml.pyx":1119 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_tuple__31 = PyTuple_Pack(1, __pyx_kp_u_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__31); + __Pyx_GIVEREF(__pyx_tuple__31); + + /* "_yaml.pyx":1128 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__32 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__32); + __Pyx_GIVEREF(__pyx_tuple__32); + + /* "_yaml.pyx":1130 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * value_object = event_object.value + */ + __pyx_tuple__33 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__33); + __Pyx_GIVEREF(__pyx_tuple__33); + + /* "_yaml.pyx":1137 + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"value must be a string") + */ + __pyx_tuple__34 = PyTuple_Pack(1, __pyx_kp_s_value_must_be_a_string); if (unlikely(!__pyx_tuple__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__34); + __Pyx_GIVEREF(__pyx_tuple__34); + + /* "_yaml.pyx":1139 + * raise TypeError("value must be a string") + * else: + * raise TypeError(u"value must be a string") # <<<<<<<<<<<<<< + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + */ + __pyx_tuple__35 = PyTuple_Pack(1, __pyx_kp_u_value_must_be_a_string); if (unlikely(!__pyx_tuple__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__35); + __Pyx_GIVEREF(__pyx_tuple__35); + + /* "_yaml.pyx":1168 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_tuple__36 = PyTuple_Pack(1, __pyx_kp_s_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__36)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__36); + __Pyx_GIVEREF(__pyx_tuple__36); + + /* "_yaml.pyx":1170 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_tuple__37 = PyTuple_Pack(1, __pyx_kp_u_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__37)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__37); + __Pyx_GIVEREF(__pyx_tuple__37); + + /* "_yaml.pyx":1179 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__38 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__38)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__38); + __Pyx_GIVEREF(__pyx_tuple__38); + + /* "_yaml.pyx":1181 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + */ + __pyx_tuple__39 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__39)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__39); + __Pyx_GIVEREF(__pyx_tuple__39); + + /* "_yaml.pyx":1200 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_tuple__40 = PyTuple_Pack(1, __pyx_kp_s_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__40)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__40); + __Pyx_GIVEREF(__pyx_tuple__40); + + /* "_yaml.pyx":1202 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * tag = NULL + */ + __pyx_tuple__41 = PyTuple_Pack(1, __pyx_kp_u_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__41)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__41); + __Pyx_GIVEREF(__pyx_tuple__41); + + /* "_yaml.pyx":1211 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__42 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__42)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__42); + __Pyx_GIVEREF(__pyx_tuple__42); + + /* "_yaml.pyx":1213 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * implicit = 0 + */ + __pyx_tuple__43 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__43)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__43); + __Pyx_GIVEREF(__pyx_tuple__43); + + /* "_yaml.pyx":1263 + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is closed") + */ + __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_s_serializer_is_closed); if (unlikely(!__pyx_tuple__44)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1263; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__44); + __Pyx_GIVEREF(__pyx_tuple__44); + + /* "_yaml.pyx":1265 + * raise SerializerError("serializer is closed") + * else: + * raise SerializerError(u"serializer is closed") # <<<<<<<<<<<<<< + * else: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_tuple__45 = PyTuple_Pack(1, __pyx_kp_u_serializer_is_closed); if (unlikely(!__pyx_tuple__45)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__45); + __Pyx_GIVEREF(__pyx_tuple__45); + + /* "_yaml.pyx":1268 + * else: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is already opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is already opened") + */ + __pyx_tuple__46 = PyTuple_Pack(1, __pyx_kp_s_serializer_is_already_opened); if (unlikely(!__pyx_tuple__46)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__46); + __Pyx_GIVEREF(__pyx_tuple__46); + + /* "_yaml.pyx":1270 + * raise SerializerError("serializer is already opened") + * else: + * raise SerializerError(u"serializer is already opened") # <<<<<<<<<<<<<< + * + * def close(self): + */ + __pyx_tuple__47 = PyTuple_Pack(1, __pyx_kp_u_serializer_is_already_opened); if (unlikely(!__pyx_tuple__47)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1270; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__47); + __Pyx_GIVEREF(__pyx_tuple__47); + + /* "_yaml.pyx":1276 + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is not opened") + */ + __pyx_tuple__48 = PyTuple_Pack(1, __pyx_kp_s_serializer_is_not_opened); if (unlikely(!__pyx_tuple__48)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__48); + __Pyx_GIVEREF(__pyx_tuple__48); + + /* "_yaml.pyx":1278 + * raise SerializerError("serializer is not opened") + * else: + * raise SerializerError(u"serializer is not opened") # <<<<<<<<<<<<<< + * elif self.closed == 0: + * yaml_stream_end_event_initialize(&event) + */ + __pyx_tuple__49 = PyTuple_Pack(1, __pyx_kp_u_serializer_is_not_opened); if (unlikely(!__pyx_tuple__49)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__49); + __Pyx_GIVEREF(__pyx_tuple__49); + + /* "_yaml.pyx":1295 + * if self.closed == -1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is not opened") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is not opened") + */ + __pyx_tuple__50 = PyTuple_Pack(1, __pyx_kp_s_serializer_is_not_opened); if (unlikely(!__pyx_tuple__50)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__50); + __Pyx_GIVEREF(__pyx_tuple__50); + + /* "_yaml.pyx":1297 + * raise SerializerError("serializer is not opened") + * else: + * raise SerializerError(u"serializer is not opened") # <<<<<<<<<<<<<< + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + */ + __pyx_tuple__51 = PyTuple_Pack(1, __pyx_kp_u_serializer_is_not_opened); if (unlikely(!__pyx_tuple__51)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1297; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__51); + __Pyx_GIVEREF(__pyx_tuple__51); + + /* "_yaml.pyx":1300 + * elif self.closed == 1: + * if PY_MAJOR_VERSION < 3: + * raise SerializerError("serializer is closed") # <<<<<<<<<<<<<< + * else: + * raise SerializerError(u"serializer is closed") + */ + __pyx_tuple__52 = PyTuple_Pack(1, __pyx_kp_s_serializer_is_closed); if (unlikely(!__pyx_tuple__52)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1300; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__52); + __Pyx_GIVEREF(__pyx_tuple__52); + + /* "_yaml.pyx":1302 + * raise SerializerError("serializer is closed") + * else: + * raise SerializerError(u"serializer is closed") # <<<<<<<<<<<<<< + * cache = [] + * version_directive = NULL + */ + __pyx_tuple__53 = PyTuple_Pack(1, __pyx_kp_u_serializer_is_closed); if (unlikely(!__pyx_tuple__53)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1302; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__53); + __Pyx_GIVEREF(__pyx_tuple__53); + + /* "_yaml.pyx":1314 + * if len(self.use_tags) > 128: + * if PY_MAJOR_VERSION < 3: + * raise ValueError("too many tags") # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"too many tags") + */ + __pyx_tuple__54 = PyTuple_Pack(1, __pyx_kp_s_too_many_tags); if (unlikely(!__pyx_tuple__54)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1314; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__54); + __Pyx_GIVEREF(__pyx_tuple__54); + + /* "_yaml.pyx":1316 + * raise ValueError("too many tags") + * else: + * raise ValueError(u"too many tags") # <<<<<<<<<<<<<< + * tag_directives_start = tag_directives_value + * tag_directives_end = tag_directives_value + */ + __pyx_tuple__55 = PyTuple_Pack(1, __pyx_kp_u_too_many_tags); if (unlikely(!__pyx_tuple__55)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1316; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__55); + __Pyx_GIVEREF(__pyx_tuple__55); + + /* "_yaml.pyx":1326 + * if not PyString_CheckExact(handle): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag handle must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag handle must be a string") + */ + __pyx_tuple__56 = PyTuple_Pack(1, __pyx_kp_s_tag_handle_must_be_a_string); if (unlikely(!__pyx_tuple__56)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1326; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__56); + __Pyx_GIVEREF(__pyx_tuple__56); + + /* "_yaml.pyx":1328 + * raise TypeError("tag handle must be a string") + * else: + * raise TypeError(u"tag handle must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.handle = PyString_AS_STRING(handle) + * if PyUnicode_CheckExact(prefix): + */ + __pyx_tuple__57 = PyTuple_Pack(1, __pyx_kp_u_tag_handle_must_be_a_string); if (unlikely(!__pyx_tuple__57)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__57); + __Pyx_GIVEREF(__pyx_tuple__57); + + /* "_yaml.pyx":1335 + * if not PyString_CheckExact(prefix): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag prefix must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag prefix must be a string") + */ + __pyx_tuple__58 = PyTuple_Pack(1, __pyx_kp_s_tag_prefix_must_be_a_string); if (unlikely(!__pyx_tuple__58)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1335; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__58); + __Pyx_GIVEREF(__pyx_tuple__58); + + /* "_yaml.pyx":1337 + * raise TypeError("tag prefix must be a string") + * else: + * raise TypeError(u"tag prefix must be a string") # <<<<<<<<<<<<<< + * tag_directives_end.prefix = PyString_AS_STRING(prefix) + * tag_directives_end = tag_directives_end+1 + */ + __pyx_tuple__59 = PyTuple_Pack(1, __pyx_kp_u_tag_prefix_must_be_a_string); if (unlikely(!__pyx_tuple__59)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1337; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__59); + __Pyx_GIVEREF(__pyx_tuple__59); + + /* "_yaml.pyx":1394 + * if not PyString_CheckExact(anchor_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("anchor must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"anchor must be a string") + */ + __pyx_tuple__60 = PyTuple_Pack(1, __pyx_kp_s_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__60)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1394; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__60); + __Pyx_GIVEREF(__pyx_tuple__60); + + /* "_yaml.pyx":1396 + * raise TypeError("anchor must be a string") + * else: + * raise TypeError(u"anchor must be a string") # <<<<<<<<<<<<<< + * anchor = PyString_AS_STRING(anchor_object) + * if node in self.serialized_nodes: + */ + __pyx_tuple__61 = PyTuple_Pack(1, __pyx_kp_u_anchor_must_be_a_string); if (unlikely(!__pyx_tuple__61)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1396; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__61); + __Pyx_GIVEREF(__pyx_tuple__61); + + /* "_yaml.pyx":1412 + * quoted_implicit = 0 + * tag_object = node.tag + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: # <<<<<<<<<<<<<< + * plain_implicit = 1 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + */ + __pyx_tuple__62 = PyTuple_Pack(2, Py_True, Py_False); if (unlikely(!__pyx_tuple__62)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1412; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__62); + __Pyx_GIVEREF(__pyx_tuple__62); + + /* "_yaml.pyx":1414 + * if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + * plain_implicit = 1 + * if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: # <<<<<<<<<<<<<< + * quoted_implicit = 1 + * tag = NULL + */ + __pyx_tuple__63 = PyTuple_Pack(2, Py_False, Py_True); if (unlikely(!__pyx_tuple__63)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1414; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__63); + __Pyx_GIVEREF(__pyx_tuple__63); + + /* "_yaml.pyx":1422 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__64 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__64)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1422; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__64); + __Pyx_GIVEREF(__pyx_tuple__64); + + /* "_yaml.pyx":1424 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * value_object = node.value + */ + __pyx_tuple__65 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__65)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1424; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__65); + __Pyx_GIVEREF(__pyx_tuple__65); + + /* "_yaml.pyx":1431 + * if not PyString_CheckExact(value_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("value must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"value must be a string") + */ + __pyx_tuple__66 = PyTuple_Pack(1, __pyx_kp_s_value_must_be_a_string); if (unlikely(!__pyx_tuple__66)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1431; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__66); + __Pyx_GIVEREF(__pyx_tuple__66); + + /* "_yaml.pyx":1433 + * raise TypeError("value must be a string") + * else: + * raise TypeError(u"value must be a string") # <<<<<<<<<<<<<< + * value = PyString_AS_STRING(value_object) + * length = PyString_GET_SIZE(value_object) + */ + __pyx_tuple__67 = PyTuple_Pack(1, __pyx_kp_u_value_must_be_a_string); if (unlikely(!__pyx_tuple__67)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1433; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__67); + __Pyx_GIVEREF(__pyx_tuple__67); + + /* "_yaml.pyx":1463 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__68 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__68)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1463; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__68); + __Pyx_GIVEREF(__pyx_tuple__68); + + /* "_yaml.pyx":1465 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * sequence_style = YAML_BLOCK_SEQUENCE_STYLE + */ + __pyx_tuple__69 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__69)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1465; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__69); + __Pyx_GIVEREF(__pyx_tuple__69); + + /* "_yaml.pyx":1495 + * if not PyString_CheckExact(tag_object): + * if PY_MAJOR_VERSION < 3: + * raise TypeError("tag must be a string") # <<<<<<<<<<<<<< + * else: + * raise TypeError(u"tag must be a string") + */ + __pyx_tuple__70 = PyTuple_Pack(1, __pyx_kp_s_tag_must_be_a_string); if (unlikely(!__pyx_tuple__70)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1495; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__70); + __Pyx_GIVEREF(__pyx_tuple__70); + + /* "_yaml.pyx":1497 + * raise TypeError("tag must be a string") + * else: + * raise TypeError(u"tag must be a string") # <<<<<<<<<<<<<< + * tag = PyString_AS_STRING(tag_object) + * mapping_style = YAML_BLOCK_MAPPING_STYLE + */ + __pyx_tuple__71 = PyTuple_Pack(1, __pyx_kp_u_tag_must_be_a_string); if (unlikely(!__pyx_tuple__71)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1497; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__71); + __Pyx_GIVEREF(__pyx_tuple__71); + + /* "_yaml.pyx":4 + * import yaml + * + * def get_version_string(): # <<<<<<<<<<<<<< + * cdef char *value + * value = yaml_get_version_string() + */ + __pyx_tuple__72 = PyTuple_Pack(1, __pyx_n_s_value); if (unlikely(!__pyx_tuple__72)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__72); + __Pyx_GIVEREF(__pyx_tuple__72); + __pyx_codeobj__73 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__72, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_root_src_pyyaml_ext__yaml_pyx, __pyx_n_s_get_version_string, 4, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__73)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "_yaml.pyx":12 + * return PyUnicode_FromString(value) + * + * def get_version(): # <<<<<<<<<<<<<< + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) + */ + __pyx_tuple__74 = PyTuple_Pack(3, __pyx_n_s_major, __pyx_n_s_minor, __pyx_n_s_patch); if (unlikely(!__pyx_tuple__74)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__74); + __Pyx_GIVEREF(__pyx_tuple__74); + __pyx_codeobj__75 = (PyObject*)__Pyx_PyCode_New(0, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__74, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_root_src_pyyaml_ext__yaml_pyx, __pyx_n_s_get_version, 12, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__75)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC init_yaml(void); /*proto*/ +PyMODINIT_FUNC init_yaml(void) +#else +PyMODINIT_FUNC PyInit__yaml(void); /*proto*/ +PyMODINIT_FUNC PyInit__yaml(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__yaml(void)", 0); + if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #ifdef __Pyx_CyFunction_USED + if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_yaml"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + if (__pyx_module_is_main__yaml) { + if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!PyDict_GetItemString(modules, "_yaml")) { + if (unlikely(PyDict_SetItemString(modules, "_yaml", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + #endif + /*--- Builtin init code ---*/ + if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Constants init code ---*/ + if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_5_yaml_Mark) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_type_5_yaml_Mark.tp_print = 0; + if (__Pyx_SetAttrString(__pyx_m, "Mark", (PyObject *)&__pyx_type_5_yaml_Mark) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5_yaml_Mark = &__pyx_type_5_yaml_Mark; + __pyx_vtabptr_5_yaml_CParser = &__pyx_vtable_5_yaml_CParser; + __pyx_vtable_5_yaml_CParser._parser_error = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *))__pyx_f_5_yaml_7CParser__parser_error; + __pyx_vtable_5_yaml_CParser._scan = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *))__pyx_f_5_yaml_7CParser__scan; + __pyx_vtable_5_yaml_CParser._token_to_object = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, yaml_token_t *))__pyx_f_5_yaml_7CParser__token_to_object; + __pyx_vtable_5_yaml_CParser._parse = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *))__pyx_f_5_yaml_7CParser__parse; + __pyx_vtable_5_yaml_CParser._event_to_object = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, yaml_event_t *))__pyx_f_5_yaml_7CParser__event_to_object; + __pyx_vtable_5_yaml_CParser._compose_document = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *))__pyx_f_5_yaml_7CParser__compose_document; + __pyx_vtable_5_yaml_CParser._compose_node = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, PyObject *, PyObject *))__pyx_f_5_yaml_7CParser__compose_node; + __pyx_vtable_5_yaml_CParser._compose_scalar_node = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, PyObject *))__pyx_f_5_yaml_7CParser__compose_scalar_node; + __pyx_vtable_5_yaml_CParser._compose_sequence_node = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, PyObject *))__pyx_f_5_yaml_7CParser__compose_sequence_node; + __pyx_vtable_5_yaml_CParser._compose_mapping_node = (PyObject *(*)(struct __pyx_obj_5_yaml_CParser *, PyObject *))__pyx_f_5_yaml_7CParser__compose_mapping_node; + __pyx_vtable_5_yaml_CParser._parse_next_event = (int (*)(struct __pyx_obj_5_yaml_CParser *))__pyx_f_5_yaml_7CParser__parse_next_event; + if (PyType_Ready(&__pyx_type_5_yaml_CParser) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_type_5_yaml_CParser.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type_5_yaml_CParser.tp_dict, __pyx_vtabptr_5_yaml_CParser) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "CParser", (PyObject *)&__pyx_type_5_yaml_CParser) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 247; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5_yaml_CParser = &__pyx_type_5_yaml_CParser; + __pyx_vtabptr_5_yaml_CEmitter = &__pyx_vtable_5_yaml_CEmitter; + __pyx_vtable_5_yaml_CEmitter._emitter_error = (PyObject *(*)(struct __pyx_obj_5_yaml_CEmitter *))__pyx_f_5_yaml_8CEmitter__emitter_error; + __pyx_vtable_5_yaml_CEmitter._object_to_event = (int (*)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *, yaml_event_t *))__pyx_f_5_yaml_8CEmitter__object_to_event; + __pyx_vtable_5_yaml_CEmitter._anchor_node = (int (*)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *))__pyx_f_5_yaml_8CEmitter__anchor_node; + __pyx_vtable_5_yaml_CEmitter._serialize_node = (int (*)(struct __pyx_obj_5_yaml_CEmitter *, PyObject *, PyObject *, PyObject *))__pyx_f_5_yaml_8CEmitter__serialize_node; + if (PyType_Ready(&__pyx_type_5_yaml_CEmitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_type_5_yaml_CEmitter.tp_print = 0; + if (__Pyx_SetVtable(__pyx_type_5_yaml_CEmitter.tp_dict, __pyx_vtabptr_5_yaml_CEmitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (__Pyx_SetAttrString(__pyx_m, "CEmitter", (PyObject *)&__pyx_type_5_yaml_CEmitter) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5_yaml_CEmitter = &__pyx_type_5_yaml_CEmitter; + /*--- Type import code ---*/ + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + + /* "_yaml.pyx":2 + * + * import yaml # <<<<<<<<<<<<<< + * + * def get_version_string(): + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_yaml, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_yaml, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":4 + * import yaml + * + * def get_version_string(): # <<<<<<<<<<<<<< + * cdef char *value + * value = yaml_get_version_string() + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_yaml_1get_version_string, NULL, __pyx_n_s_yaml_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_version_string, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":12 + * return PyUnicode_FromString(value) + * + * def get_version(): # <<<<<<<<<<<<<< + * cdef int major, minor, patch + * yaml_get_version(&major, &minor, &patch) + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_yaml_3get_version, NULL, __pyx_n_s_yaml_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_version, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":18 + * + * #Mark = yaml.error.Mark + * YAMLError = yaml.error.YAMLError # <<<<<<<<<<<<<< + * ReaderError = yaml.reader.ReaderError + * ScannerError = yaml.scanner.ScannerError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_error); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_YAMLError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_YAMLError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":19 + * #Mark = yaml.error.Mark + * YAMLError = yaml.error.YAMLError + * ReaderError = yaml.reader.ReaderError # <<<<<<<<<<<<<< + * ScannerError = yaml.scanner.ScannerError + * ParserError = yaml.parser.ParserError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_reader); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ReaderError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ReaderError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":20 + * YAMLError = yaml.error.YAMLError + * ReaderError = yaml.reader.ReaderError + * ScannerError = yaml.scanner.ScannerError # <<<<<<<<<<<<<< + * ParserError = yaml.parser.ParserError + * ComposerError = yaml.composer.ComposerError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_scanner); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ScannerError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ScannerError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":21 + * ReaderError = yaml.reader.ReaderError + * ScannerError = yaml.scanner.ScannerError + * ParserError = yaml.parser.ParserError # <<<<<<<<<<<<<< + * ComposerError = yaml.composer.ComposerError + * ConstructorError = yaml.constructor.ConstructorError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_parser); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ParserError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ParserError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":22 + * ScannerError = yaml.scanner.ScannerError + * ParserError = yaml.parser.ParserError + * ComposerError = yaml.composer.ComposerError # <<<<<<<<<<<<<< + * ConstructorError = yaml.constructor.ConstructorError + * EmitterError = yaml.emitter.EmitterError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_composer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ComposerError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ComposerError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":23 + * ParserError = yaml.parser.ParserError + * ComposerError = yaml.composer.ComposerError + * ConstructorError = yaml.constructor.ConstructorError # <<<<<<<<<<<<<< + * EmitterError = yaml.emitter.EmitterError + * SerializerError = yaml.serializer.SerializerError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_constructor); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ConstructorError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ConstructorError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":24 + * ComposerError = yaml.composer.ComposerError + * ConstructorError = yaml.constructor.ConstructorError + * EmitterError = yaml.emitter.EmitterError # <<<<<<<<<<<<<< + * SerializerError = yaml.serializer.SerializerError + * RepresenterError = yaml.representer.RepresenterError + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_emitter); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_EmitterError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_EmitterError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":25 + * ConstructorError = yaml.constructor.ConstructorError + * EmitterError = yaml.emitter.EmitterError + * SerializerError = yaml.serializer.SerializerError # <<<<<<<<<<<<<< + * RepresenterError = yaml.representer.RepresenterError + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_serializer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_SerializerError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SerializerError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":26 + * EmitterError = yaml.emitter.EmitterError + * SerializerError = yaml.serializer.SerializerError + * RepresenterError = yaml.representer.RepresenterError # <<<<<<<<<<<<<< + * + * StreamStartToken = yaml.tokens.StreamStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_representer); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_RepresenterError); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_RepresenterError, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":28 + * RepresenterError = yaml.representer.RepresenterError + * + * StreamStartToken = yaml.tokens.StreamStartToken # <<<<<<<<<<<<<< + * StreamEndToken = yaml.tokens.StreamEndToken + * DirectiveToken = yaml.tokens.DirectiveToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_StreamStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":29 + * + * StreamStartToken = yaml.tokens.StreamStartToken + * StreamEndToken = yaml.tokens.StreamEndToken # <<<<<<<<<<<<<< + * DirectiveToken = yaml.tokens.DirectiveToken + * DocumentStartToken = yaml.tokens.DocumentStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_StreamEndToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamEndToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":30 + * StreamStartToken = yaml.tokens.StreamStartToken + * StreamEndToken = yaml.tokens.StreamEndToken + * DirectiveToken = yaml.tokens.DirectiveToken # <<<<<<<<<<<<<< + * DocumentStartToken = yaml.tokens.DocumentStartToken + * DocumentEndToken = yaml.tokens.DocumentEndToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_DirectiveToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DirectiveToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":31 + * StreamEndToken = yaml.tokens.StreamEndToken + * DirectiveToken = yaml.tokens.DirectiveToken + * DocumentStartToken = yaml.tokens.DocumentStartToken # <<<<<<<<<<<<<< + * DocumentEndToken = yaml.tokens.DocumentEndToken + * BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_DocumentStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DocumentStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":32 + * DirectiveToken = yaml.tokens.DirectiveToken + * DocumentStartToken = yaml.tokens.DocumentStartToken + * DocumentEndToken = yaml.tokens.DocumentEndToken # <<<<<<<<<<<<<< + * BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken + * BlockMappingStartToken = yaml.tokens.BlockMappingStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_DocumentEndToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DocumentEndToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":33 + * DocumentStartToken = yaml.tokens.DocumentStartToken + * DocumentEndToken = yaml.tokens.DocumentEndToken + * BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken # <<<<<<<<<<<<<< + * BlockMappingStartToken = yaml.tokens.BlockMappingStartToken + * BlockEndToken = yaml.tokens.BlockEndToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_BlockSequenceStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BlockSequenceStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":34 + * DocumentEndToken = yaml.tokens.DocumentEndToken + * BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken + * BlockMappingStartToken = yaml.tokens.BlockMappingStartToken # <<<<<<<<<<<<<< + * BlockEndToken = yaml.tokens.BlockEndToken + * FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_BlockMappingStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BlockMappingStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":35 + * BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken + * BlockMappingStartToken = yaml.tokens.BlockMappingStartToken + * BlockEndToken = yaml.tokens.BlockEndToken # <<<<<<<<<<<<<< + * FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken + * FlowMappingStartToken = yaml.tokens.FlowMappingStartToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_BlockEndToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BlockEndToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":36 + * BlockMappingStartToken = yaml.tokens.BlockMappingStartToken + * BlockEndToken = yaml.tokens.BlockEndToken + * FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken # <<<<<<<<<<<<<< + * FlowMappingStartToken = yaml.tokens.FlowMappingStartToken + * FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_FlowSequenceStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FlowSequenceStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":37 + * BlockEndToken = yaml.tokens.BlockEndToken + * FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken + * FlowMappingStartToken = yaml.tokens.FlowMappingStartToken # <<<<<<<<<<<<<< + * FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken + * FlowMappingEndToken = yaml.tokens.FlowMappingEndToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_FlowMappingStartToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FlowMappingStartToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":38 + * FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken + * FlowMappingStartToken = yaml.tokens.FlowMappingStartToken + * FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken # <<<<<<<<<<<<<< + * FlowMappingEndToken = yaml.tokens.FlowMappingEndToken + * KeyToken = yaml.tokens.KeyToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_FlowSequenceEndToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FlowSequenceEndToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":39 + * FlowMappingStartToken = yaml.tokens.FlowMappingStartToken + * FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken + * FlowMappingEndToken = yaml.tokens.FlowMappingEndToken # <<<<<<<<<<<<<< + * KeyToken = yaml.tokens.KeyToken + * ValueToken = yaml.tokens.ValueToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_FlowMappingEndToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FlowMappingEndToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":40 + * FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken + * FlowMappingEndToken = yaml.tokens.FlowMappingEndToken + * KeyToken = yaml.tokens.KeyToken # <<<<<<<<<<<<<< + * ValueToken = yaml.tokens.ValueToken + * BlockEntryToken = yaml.tokens.BlockEntryToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_KeyToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_KeyToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":41 + * FlowMappingEndToken = yaml.tokens.FlowMappingEndToken + * KeyToken = yaml.tokens.KeyToken + * ValueToken = yaml.tokens.ValueToken # <<<<<<<<<<<<<< + * BlockEntryToken = yaml.tokens.BlockEntryToken + * FlowEntryToken = yaml.tokens.FlowEntryToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ValueToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ValueToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":42 + * KeyToken = yaml.tokens.KeyToken + * ValueToken = yaml.tokens.ValueToken + * BlockEntryToken = yaml.tokens.BlockEntryToken # <<<<<<<<<<<<<< + * FlowEntryToken = yaml.tokens.FlowEntryToken + * AliasToken = yaml.tokens.AliasToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_BlockEntryToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BlockEntryToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":43 + * ValueToken = yaml.tokens.ValueToken + * BlockEntryToken = yaml.tokens.BlockEntryToken + * FlowEntryToken = yaml.tokens.FlowEntryToken # <<<<<<<<<<<<<< + * AliasToken = yaml.tokens.AliasToken + * AnchorToken = yaml.tokens.AnchorToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_FlowEntryToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_FlowEntryToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":44 + * BlockEntryToken = yaml.tokens.BlockEntryToken + * FlowEntryToken = yaml.tokens.FlowEntryToken + * AliasToken = yaml.tokens.AliasToken # <<<<<<<<<<<<<< + * AnchorToken = yaml.tokens.AnchorToken + * TagToken = yaml.tokens.TagToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_AliasToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_AliasToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":45 + * FlowEntryToken = yaml.tokens.FlowEntryToken + * AliasToken = yaml.tokens.AliasToken + * AnchorToken = yaml.tokens.AnchorToken # <<<<<<<<<<<<<< + * TagToken = yaml.tokens.TagToken + * ScalarToken = yaml.tokens.ScalarToken + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_AnchorToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_AnchorToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":46 + * AliasToken = yaml.tokens.AliasToken + * AnchorToken = yaml.tokens.AnchorToken + * TagToken = yaml.tokens.TagToken # <<<<<<<<<<<<<< + * ScalarToken = yaml.tokens.ScalarToken + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_TagToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_TagToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":47 + * AnchorToken = yaml.tokens.AnchorToken + * TagToken = yaml.tokens.TagToken + * ScalarToken = yaml.tokens.ScalarToken # <<<<<<<<<<<<<< + * + * StreamStartEvent = yaml.events.StreamStartEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_tokens); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ScalarToken); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ScalarToken, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":49 + * ScalarToken = yaml.tokens.ScalarToken + * + * StreamStartEvent = yaml.events.StreamStartEvent # <<<<<<<<<<<<<< + * StreamEndEvent = yaml.events.StreamEndEvent + * DocumentStartEvent = yaml.events.DocumentStartEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_StreamStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamStartEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":50 + * + * StreamStartEvent = yaml.events.StreamStartEvent + * StreamEndEvent = yaml.events.StreamEndEvent # <<<<<<<<<<<<<< + * DocumentStartEvent = yaml.events.DocumentStartEvent + * DocumentEndEvent = yaml.events.DocumentEndEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_StreamEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamEndEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":51 + * StreamStartEvent = yaml.events.StreamStartEvent + * StreamEndEvent = yaml.events.StreamEndEvent + * DocumentStartEvent = yaml.events.DocumentStartEvent # <<<<<<<<<<<<<< + * DocumentEndEvent = yaml.events.DocumentEndEvent + * AliasEvent = yaml.events.AliasEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_DocumentStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DocumentStartEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":52 + * StreamEndEvent = yaml.events.StreamEndEvent + * DocumentStartEvent = yaml.events.DocumentStartEvent + * DocumentEndEvent = yaml.events.DocumentEndEvent # <<<<<<<<<<<<<< + * AliasEvent = yaml.events.AliasEvent + * ScalarEvent = yaml.events.ScalarEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_DocumentEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DocumentEndEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":53 + * DocumentStartEvent = yaml.events.DocumentStartEvent + * DocumentEndEvent = yaml.events.DocumentEndEvent + * AliasEvent = yaml.events.AliasEvent # <<<<<<<<<<<<<< + * ScalarEvent = yaml.events.ScalarEvent + * SequenceStartEvent = yaml.events.SequenceStartEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_AliasEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_AliasEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":54 + * DocumentEndEvent = yaml.events.DocumentEndEvent + * AliasEvent = yaml.events.AliasEvent + * ScalarEvent = yaml.events.ScalarEvent # <<<<<<<<<<<<<< + * SequenceStartEvent = yaml.events.SequenceStartEvent + * SequenceEndEvent = yaml.events.SequenceEndEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ScalarEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ScalarEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":55 + * AliasEvent = yaml.events.AliasEvent + * ScalarEvent = yaml.events.ScalarEvent + * SequenceStartEvent = yaml.events.SequenceStartEvent # <<<<<<<<<<<<<< + * SequenceEndEvent = yaml.events.SequenceEndEvent + * MappingStartEvent = yaml.events.MappingStartEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_SequenceStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SequenceStartEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":56 + * ScalarEvent = yaml.events.ScalarEvent + * SequenceStartEvent = yaml.events.SequenceStartEvent + * SequenceEndEvent = yaml.events.SequenceEndEvent # <<<<<<<<<<<<<< + * MappingStartEvent = yaml.events.MappingStartEvent + * MappingEndEvent = yaml.events.MappingEndEvent + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_SequenceEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SequenceEndEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":57 + * SequenceStartEvent = yaml.events.SequenceStartEvent + * SequenceEndEvent = yaml.events.SequenceEndEvent + * MappingStartEvent = yaml.events.MappingStartEvent # <<<<<<<<<<<<<< + * MappingEndEvent = yaml.events.MappingEndEvent + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_MappingStartEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_MappingStartEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":58 + * SequenceEndEvent = yaml.events.SequenceEndEvent + * MappingStartEvent = yaml.events.MappingStartEvent + * MappingEndEvent = yaml.events.MappingEndEvent # <<<<<<<<<<<<<< + * + * ScalarNode = yaml.nodes.ScalarNode + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_events); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_MappingEndEvent); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_MappingEndEvent, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":60 + * MappingEndEvent = yaml.events.MappingEndEvent + * + * ScalarNode = yaml.nodes.ScalarNode # <<<<<<<<<<<<<< + * SequenceNode = yaml.nodes.SequenceNode + * MappingNode = yaml.nodes.MappingNode + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ScalarNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ScalarNode, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 60; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":61 + * + * ScalarNode = yaml.nodes.ScalarNode + * SequenceNode = yaml.nodes.SequenceNode # <<<<<<<<<<<<<< + * MappingNode = yaml.nodes.MappingNode + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_SequenceNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_SequenceNode, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":62 + * ScalarNode = yaml.nodes.ScalarNode + * SequenceNode = yaml.nodes.SequenceNode + * MappingNode = yaml.nodes.MappingNode # <<<<<<<<<<<<<< + * + * cdef class Mark: + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_yaml); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_nodes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_MappingNode); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_MappingNode, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "_yaml.pyx":2 + * + * import yaml # <<<<<<<<<<<<<< + * + * def get_version_string(): + */ + __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + __Pyx_AddTraceback("init _yaml", __pyx_clineno, __pyx_lineno, __pyx_filename); + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init _yaml"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* Runtime support code */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif /* CYTHON_REFNANNY */ + +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +#else + PyErr_GetExcInfo(type, value, tb); +#endif +} +static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(type, value, tb); +#endif +} + +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_COMPILING_IN_CPYTHON + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); +#if PY_VERSION_HEX >= 0x02060000 + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; +#endif + result = (*call)(func, arg, kw); +#if PY_VERSION_HEX >= 0x02060000 + Py_LeaveRecursiveCall(); +#endif + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_Restore(type, value, tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(type, value, tb); +#endif +} + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + #if PY_VERSION_HEX < 0x02050000 + if (PyClass_Check(type)) { + #else + if (PyType_Check(type)) { + #endif +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + #if PY_VERSION_HEX < 0x02050000 + if (PyInstance_Check(type)) { + type = (PyObject*) ((PyInstanceObject*)type)->in_class; + Py_INCREF(type); + } else { + type = 0; + PyErr_SetString(PyExc_TypeError, + "raise: exception must be an old-style class or instance"); + goto raise_error; + } + #else + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + #endif + } + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else /* Python 3+ */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + if (PyObject_IsSubclass(instance_class, type)) { + type = instance_class; + } else { + instance_class = NULL; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON + result = PyDict_GetItem(__pyx_d, name); + if (result) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +static CYTHON_INLINE int __Pyx_CheckKeywordStrings( + PyObject *kwdict, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CPYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + while (PyDict_Next(kwdict, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if ((!kw_allowed) && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) { + PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname); +} + +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_COMPILING_IN_CPYTHON +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) + goto bad; + PyErr_Clear(); + r = d; + Py_INCREF(d); + } + return r; +bad: + return NULL; +} + +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + #if CYTHON_PEP393_ENABLED + if (unlikely(PyUnicode_READY(s1) < 0) || unlikely(PyUnicode_READY(s2) < 0)) + return -1; + #endif + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, length * kind); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck) { +#if CYTHON_COMPILING_IN_CPYTHON + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_Clear(); + else + return NULL; + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +static CYTHON_INLINE int __Pyx_IterFinish(void) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + PyObject* exc_type = tstate->curexc_type; + if (unlikely(exc_type)) { + if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { + PyObject *exc_value, *exc_tb; + exc_value = tstate->curexc_value; + exc_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + return 0; + } else { + return -1; + } + } + return 0; +#else + if (unlikely(PyErr_Occurred())) { + if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { + PyErr_Clear(); + return 0; + } else { + return -1; + } + } + return 0; +#endif +} + +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } else { + return __Pyx_IterFinish(); + } + return 0; +} + +static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(int) <= sizeof(unsigned long long)) { + return PyLong_FromUnsignedLongLong((unsigned long long) value); + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(long long)) { + return PyLong_FromLongLong((long long) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + #if PY_VERSION_HEX >= 0x02050000 + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; /* try absolute import on failure */ + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } + #else + if (level>0) { + PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); + goto bad; + } + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, NULL); + #endif +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func) \ + { \ + func_type value = func(x); \ + if (sizeof(target_type) < sizeof(func_type)) { \ + if (unlikely(value != (func_type) (target_type) value)) { \ + func_type zero = 0; \ + PyErr_SetString(PyExc_OverflowError, \ + (is_unsigned && unlikely(value < zero)) ? \ + "can't convert negative value to " #target_type : \ + "value too large to convert to " #target_type); \ + return (target_type) -1; \ + } \ + } \ + return (target_type) value; \ + } + +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #endif +#endif +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + if (sizeof(digit) <= sizeof(int)) { + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: return (int) ((PyLongObject*)x)->ob_digit[0]; + } + } + #endif +#endif + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; + } + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong) + } else if (sizeof(int) <= sizeof(unsigned long long)) { + __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong) + } + } else { +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + if (sizeof(digit) <= sizeof(int)) { + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: return +(int) ((PyLongObject*)x)->ob_digit[0]; + case -1: return -(int) ((PyLongObject*)x)->ob_digit[0]; + } + } + #endif +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong) + } else if (sizeof(int) <= sizeof(long long)) { + __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +} + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(long) <= sizeof(unsigned long long)) { + return PyLong_FromUnsignedLongLong((unsigned long long) value); + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(long long)) { + return PyLong_FromLongLong((long long) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #endif +#endif +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + if (sizeof(digit) <= sizeof(long)) { + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: return (long) ((PyLongObject*)x)->ob_digit[0]; + } + } + #endif +#endif + if (unlikely(Py_SIZE(x) < 0)) { + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; + } + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong) + } else if (sizeof(long) <= sizeof(unsigned long long)) { + __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong) + } + } else { +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + if (sizeof(digit) <= sizeof(long)) { + switch (Py_SIZE(x)) { + case 0: return 0; + case 1: return +(long) ((PyLongObject*)x)->ob_digit[0]; + case -1: return -(long) ((PyLongObject*)x)->ob_digit[0]; + } + } + #endif +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong) + } else if (sizeof(long) <= sizeof(long long)) { + __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +} + +static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + #if PY_VERSION_HEX < 0x02050000 + return PyErr_Warn(NULL, message); + #else + return PyErr_WarnEx(NULL, message, 1); + #endif + } + return 0; +} + +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = (start + end) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, /*int argcount,*/ + 0, /*int kwonlyargcount,*/ + 0, /*int nlocals,*/ + 0, /*int stacksize,*/ + 0, /*int flags,*/ + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, /*int firstlineno,*/ + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_globals = 0; + PyFrameObject *py_frame = 0; + py_code = __pyx_find_code_object(c_line ? c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? c_line : py_line, py_code); + } + py_globals = PyModule_GetDict(__pyx_m); + if (!py_globals) goto bad; + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + py_globals, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + py_frame->f_lineno = py_line; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else /* Python 3+ has unicode identifiers */ + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, strlen(c_str)); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif /*__PYX_DEFAULT_STRING_ENCODING_IS_ASCII*/ + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else /* PY_VERSION_HEX < 0x03030000 */ + if (PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_DATA_SIZE(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ + return PyUnicode_AsUTF8AndSize(o, length); +#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ +#endif /* PY_VERSION_HEX < 0x03030000 */ + } else +#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */ +#if !CYTHON_COMPILING_IN_PYPY +#if PY_VERSION_HEX >= 0x02060000 + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { + PyNumberMethods *m; + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return Py_INCREF(x), x; + m = Py_TYPE(x)->tp_as_number; +#if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } +#else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #endif +#endif +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) + return PyInt_AS_LONG(b); +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 + #if CYTHON_USE_PYLONG_INTERNALS + switch (Py_SIZE(b)) { + case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0]; + case 0: return 0; + case 1: return ((PyLongObject*)b)->ob_digit[0]; + } + #endif + #endif + #if PY_VERSION_HEX < 0x02060000 + return PyInt_AsSsize_t(b); + #else + return PyLong_AsSsize_t(b); + #endif + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { +#if PY_VERSION_HEX < 0x02050000 + if (ival <= LONG_MAX) + return PyInt_FromLong((long)ival); + else { + unsigned char *bytes = (unsigned char *) &ival; + int one = 1; int little = (int)*(unsigned char*)&one; + return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); + } +#else + return PyInt_FromSize_t(ival); +#endif +} + + +#endif /* Py_PYTHON_H */ diff --git a/python/pyyaml/ext/_yaml.h b/python/pyyaml/ext/_yaml.h new file mode 100644 index 000000000000..21fd6a991b31 --- /dev/null +++ b/python/pyyaml/ext/_yaml.h @@ -0,0 +1,23 @@ + +#include + +#if PY_MAJOR_VERSION < 3 + +#define PyUnicode_FromString(s) PyUnicode_DecodeUTF8((s), strlen(s), "strict") + +#else + +#define PyString_CheckExact PyBytes_CheckExact +#define PyString_AS_STRING PyBytes_AS_STRING +#define PyString_GET_SIZE PyBytes_GET_SIZE +#define PyString_FromStringAndSize PyBytes_FromStringAndSize + +#endif + +#ifdef _MSC_VER /* MS Visual C++ 6.0 */ +#if _MSC_VER == 1200 + +#define PyLong_FromUnsignedLongLong(z) PyInt_FromLong(i) + +#endif +#endif diff --git a/python/pyyaml/ext/_yaml.pxd b/python/pyyaml/ext/_yaml.pxd new file mode 100644 index 000000000000..f47f459cc2bc --- /dev/null +++ b/python/pyyaml/ext/_yaml.pxd @@ -0,0 +1,251 @@ + +cdef extern from "_yaml.h": + + void malloc(int l) + void memcpy(char *d, char *s, int l) + int strlen(char *s) + int PyString_CheckExact(object o) + int PyUnicode_CheckExact(object o) + char *PyString_AS_STRING(object o) + int PyString_GET_SIZE(object o) + object PyString_FromStringAndSize(char *v, int l) + object PyUnicode_FromString(char *u) + object PyUnicode_DecodeUTF8(char *u, int s, char *e) + object PyUnicode_AsUTF8String(object o) + int PY_MAJOR_VERSION + + ctypedef enum: + SIZEOF_VOID_P + ctypedef enum yaml_encoding_t: + YAML_ANY_ENCODING + YAML_UTF8_ENCODING + YAML_UTF16LE_ENCODING + YAML_UTF16BE_ENCODING + ctypedef enum yaml_break_t: + YAML_ANY_BREAK + YAML_CR_BREAK + YAML_LN_BREAK + YAML_CRLN_BREAK + ctypedef enum yaml_error_type_t: + YAML_NO_ERROR + YAML_MEMORY_ERROR + YAML_READER_ERROR + YAML_SCANNER_ERROR + YAML_PARSER_ERROR + YAML_WRITER_ERROR + YAML_EMITTER_ERROR + ctypedef enum yaml_scalar_style_t: + YAML_ANY_SCALAR_STYLE + YAML_PLAIN_SCALAR_STYLE + YAML_SINGLE_QUOTED_SCALAR_STYLE + YAML_DOUBLE_QUOTED_SCALAR_STYLE + YAML_LITERAL_SCALAR_STYLE + YAML_FOLDED_SCALAR_STYLE + ctypedef enum yaml_sequence_style_t: + YAML_ANY_SEQUENCE_STYLE + YAML_BLOCK_SEQUENCE_STYLE + YAML_FLOW_SEQUENCE_STYLE + ctypedef enum yaml_mapping_style_t: + YAML_ANY_MAPPING_STYLE + YAML_BLOCK_MAPPING_STYLE + YAML_FLOW_MAPPING_STYLE + ctypedef enum yaml_token_type_t: + YAML_NO_TOKEN + YAML_STREAM_START_TOKEN + YAML_STREAM_END_TOKEN + YAML_VERSION_DIRECTIVE_TOKEN + YAML_TAG_DIRECTIVE_TOKEN + YAML_DOCUMENT_START_TOKEN + YAML_DOCUMENT_END_TOKEN + YAML_BLOCK_SEQUENCE_START_TOKEN + YAML_BLOCK_MAPPING_START_TOKEN + YAML_BLOCK_END_TOKEN + YAML_FLOW_SEQUENCE_START_TOKEN + YAML_FLOW_SEQUENCE_END_TOKEN + YAML_FLOW_MAPPING_START_TOKEN + YAML_FLOW_MAPPING_END_TOKEN + YAML_BLOCK_ENTRY_TOKEN + YAML_FLOW_ENTRY_TOKEN + YAML_KEY_TOKEN + YAML_VALUE_TOKEN + YAML_ALIAS_TOKEN + YAML_ANCHOR_TOKEN + YAML_TAG_TOKEN + YAML_SCALAR_TOKEN + ctypedef enum yaml_event_type_t: + YAML_NO_EVENT + YAML_STREAM_START_EVENT + YAML_STREAM_END_EVENT + YAML_DOCUMENT_START_EVENT + YAML_DOCUMENT_END_EVENT + YAML_ALIAS_EVENT + YAML_SCALAR_EVENT + YAML_SEQUENCE_START_EVENT + YAML_SEQUENCE_END_EVENT + YAML_MAPPING_START_EVENT + YAML_MAPPING_END_EVENT + + ctypedef int yaml_read_handler_t(void *data, char *buffer, + int size, int *size_read) except 0 + + ctypedef int yaml_write_handler_t(void *data, char *buffer, + int size) except 0 + + ctypedef struct yaml_mark_t: + int index + int line + int column + ctypedef struct yaml_version_directive_t: + int major + int minor + ctypedef struct yaml_tag_directive_t: + char *handle + char *prefix + + ctypedef struct _yaml_token_stream_start_data_t: + yaml_encoding_t encoding + ctypedef struct _yaml_token_alias_data_t: + char *value + ctypedef struct _yaml_token_anchor_data_t: + char *value + ctypedef struct _yaml_token_tag_data_t: + char *handle + char *suffix + ctypedef struct _yaml_token_scalar_data_t: + char *value + int length + yaml_scalar_style_t style + ctypedef struct _yaml_token_version_directive_data_t: + int major + int minor + ctypedef struct _yaml_token_tag_directive_data_t: + char *handle + char *prefix + ctypedef union _yaml_token_data_t: + _yaml_token_stream_start_data_t stream_start + _yaml_token_alias_data_t alias + _yaml_token_anchor_data_t anchor + _yaml_token_tag_data_t tag + _yaml_token_scalar_data_t scalar + _yaml_token_version_directive_data_t version_directive + _yaml_token_tag_directive_data_t tag_directive + ctypedef struct yaml_token_t: + yaml_token_type_t type + _yaml_token_data_t data + yaml_mark_t start_mark + yaml_mark_t end_mark + + ctypedef struct _yaml_event_stream_start_data_t: + yaml_encoding_t encoding + ctypedef struct _yaml_event_document_start_data_tag_directives_t: + yaml_tag_directive_t *start + yaml_tag_directive_t *end + ctypedef struct _yaml_event_document_start_data_t: + yaml_version_directive_t *version_directive + _yaml_event_document_start_data_tag_directives_t tag_directives + int implicit + ctypedef struct _yaml_event_document_end_data_t: + int implicit + ctypedef struct _yaml_event_alias_data_t: + char *anchor + ctypedef struct _yaml_event_scalar_data_t: + char *anchor + char *tag + char *value + int length + int plain_implicit + int quoted_implicit + yaml_scalar_style_t style + ctypedef struct _yaml_event_sequence_start_data_t: + char *anchor + char *tag + int implicit + yaml_sequence_style_t style + ctypedef struct _yaml_event_mapping_start_data_t: + char *anchor + char *tag + int implicit + yaml_mapping_style_t style + ctypedef union _yaml_event_data_t: + _yaml_event_stream_start_data_t stream_start + _yaml_event_document_start_data_t document_start + _yaml_event_document_end_data_t document_end + _yaml_event_alias_data_t alias + _yaml_event_scalar_data_t scalar + _yaml_event_sequence_start_data_t sequence_start + _yaml_event_mapping_start_data_t mapping_start + ctypedef struct yaml_event_t: + yaml_event_type_t type + _yaml_event_data_t data + yaml_mark_t start_mark + yaml_mark_t end_mark + + ctypedef struct yaml_parser_t: + yaml_error_type_t error + char *problem + int problem_offset + int problem_value + yaml_mark_t problem_mark + char *context + yaml_mark_t context_mark + + ctypedef struct yaml_emitter_t: + yaml_error_type_t error + char *problem + + char *yaml_get_version_string() + void yaml_get_version(int *major, int *minor, int *patch) + + void yaml_token_delete(yaml_token_t *token) + + int yaml_stream_start_event_initialize(yaml_event_t *event, + yaml_encoding_t encoding) + int yaml_stream_end_event_initialize(yaml_event_t *event) + int yaml_document_start_event_initialize(yaml_event_t *event, + yaml_version_directive_t *version_directive, + yaml_tag_directive_t *tag_directives_start, + yaml_tag_directive_t *tag_directives_end, + int implicit) + int yaml_document_end_event_initialize(yaml_event_t *event, + int implicit) + int yaml_alias_event_initialize(yaml_event_t *event, char *anchor) + int yaml_scalar_event_initialize(yaml_event_t *event, + char *anchor, char *tag, char *value, int length, + int plain_implicit, int quoted_implicit, + yaml_scalar_style_t style) + int yaml_sequence_start_event_initialize(yaml_event_t *event, + char *anchor, char *tag, int implicit, yaml_sequence_style_t style) + int yaml_sequence_end_event_initialize(yaml_event_t *event) + int yaml_mapping_start_event_initialize(yaml_event_t *event, + char *anchor, char *tag, int implicit, yaml_mapping_style_t style) + int yaml_mapping_end_event_initialize(yaml_event_t *event) + void yaml_event_delete(yaml_event_t *event) + + int yaml_parser_initialize(yaml_parser_t *parser) + void yaml_parser_delete(yaml_parser_t *parser) + void yaml_parser_set_input_string(yaml_parser_t *parser, + char *input, int size) + void yaml_parser_set_input(yaml_parser_t *parser, + yaml_read_handler_t *handler, void *data) + void yaml_parser_set_encoding(yaml_parser_t *parser, + yaml_encoding_t encoding) + int yaml_parser_scan(yaml_parser_t *parser, yaml_token_t *token) except * + int yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event) except * + + int yaml_emitter_initialize(yaml_emitter_t *emitter) + void yaml_emitter_delete(yaml_emitter_t *emitter) + void yaml_emitter_set_output_string(yaml_emitter_t *emitter, + char *output, int size, int *size_written) + void yaml_emitter_set_output(yaml_emitter_t *emitter, + yaml_write_handler_t *handler, void *data) + void yaml_emitter_set_encoding(yaml_emitter_t *emitter, + yaml_encoding_t encoding) + void yaml_emitter_set_canonical(yaml_emitter_t *emitter, int canonical) + void yaml_emitter_set_indent(yaml_emitter_t *emitter, int indent) + void yaml_emitter_set_width(yaml_emitter_t *emitter, int width) + void yaml_emitter_set_unicode(yaml_emitter_t *emitter, int unicode) + void yaml_emitter_set_break(yaml_emitter_t *emitter, + yaml_break_t line_break) + int yaml_emitter_emit(yaml_emitter_t *emitter, yaml_event_t *event) except * + int yaml_emitter_flush(yaml_emitter_t *emitter) + diff --git a/python/pyyaml/ext/_yaml.pyx b/python/pyyaml/ext/_yaml.pyx new file mode 100644 index 000000000000..5158fb4d9ece --- /dev/null +++ b/python/pyyaml/ext/_yaml.pyx @@ -0,0 +1,1527 @@ + +import yaml + +def get_version_string(): + cdef char *value + value = yaml_get_version_string() + if PY_MAJOR_VERSION < 3: + return value + else: + return PyUnicode_FromString(value) + +def get_version(): + cdef int major, minor, patch + yaml_get_version(&major, &minor, &patch) + return (major, minor, patch) + +#Mark = yaml.error.Mark +YAMLError = yaml.error.YAMLError +ReaderError = yaml.reader.ReaderError +ScannerError = yaml.scanner.ScannerError +ParserError = yaml.parser.ParserError +ComposerError = yaml.composer.ComposerError +ConstructorError = yaml.constructor.ConstructorError +EmitterError = yaml.emitter.EmitterError +SerializerError = yaml.serializer.SerializerError +RepresenterError = yaml.representer.RepresenterError + +StreamStartToken = yaml.tokens.StreamStartToken +StreamEndToken = yaml.tokens.StreamEndToken +DirectiveToken = yaml.tokens.DirectiveToken +DocumentStartToken = yaml.tokens.DocumentStartToken +DocumentEndToken = yaml.tokens.DocumentEndToken +BlockSequenceStartToken = yaml.tokens.BlockSequenceStartToken +BlockMappingStartToken = yaml.tokens.BlockMappingStartToken +BlockEndToken = yaml.tokens.BlockEndToken +FlowSequenceStartToken = yaml.tokens.FlowSequenceStartToken +FlowMappingStartToken = yaml.tokens.FlowMappingStartToken +FlowSequenceEndToken = yaml.tokens.FlowSequenceEndToken +FlowMappingEndToken = yaml.tokens.FlowMappingEndToken +KeyToken = yaml.tokens.KeyToken +ValueToken = yaml.tokens.ValueToken +BlockEntryToken = yaml.tokens.BlockEntryToken +FlowEntryToken = yaml.tokens.FlowEntryToken +AliasToken = yaml.tokens.AliasToken +AnchorToken = yaml.tokens.AnchorToken +TagToken = yaml.tokens.TagToken +ScalarToken = yaml.tokens.ScalarToken + +StreamStartEvent = yaml.events.StreamStartEvent +StreamEndEvent = yaml.events.StreamEndEvent +DocumentStartEvent = yaml.events.DocumentStartEvent +DocumentEndEvent = yaml.events.DocumentEndEvent +AliasEvent = yaml.events.AliasEvent +ScalarEvent = yaml.events.ScalarEvent +SequenceStartEvent = yaml.events.SequenceStartEvent +SequenceEndEvent = yaml.events.SequenceEndEvent +MappingStartEvent = yaml.events.MappingStartEvent +MappingEndEvent = yaml.events.MappingEndEvent + +ScalarNode = yaml.nodes.ScalarNode +SequenceNode = yaml.nodes.SequenceNode +MappingNode = yaml.nodes.MappingNode + +cdef class Mark: + cdef readonly object name + cdef readonly int index + cdef readonly int line + cdef readonly int column + cdef readonly buffer + cdef readonly pointer + + def __init__(self, object name, int index, int line, int column, + object buffer, object pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self): + return None + + def __str__(self): + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + return where + +#class YAMLError(Exception): +# pass +# +#class MarkedYAMLError(YAMLError): +# +# def __init__(self, context=None, context_mark=None, +# problem=None, problem_mark=None, note=None): +# self.context = context +# self.context_mark = context_mark +# self.problem = problem +# self.problem_mark = problem_mark +# self.note = note +# +# def __str__(self): +# lines = [] +# if self.context is not None: +# lines.append(self.context) +# if self.context_mark is not None \ +# and (self.problem is None or self.problem_mark is None +# or self.context_mark.name != self.problem_mark.name +# or self.context_mark.line != self.problem_mark.line +# or self.context_mark.column != self.problem_mark.column): +# lines.append(str(self.context_mark)) +# if self.problem is not None: +# lines.append(self.problem) +# if self.problem_mark is not None: +# lines.append(str(self.problem_mark)) +# if self.note is not None: +# lines.append(self.note) +# return '\n'.join(lines) +# +#class ReaderError(YAMLError): +# +# def __init__(self, name, position, character, encoding, reason): +# self.name = name +# self.character = character +# self.position = position +# self.encoding = encoding +# self.reason = reason +# +# def __str__(self): +# if isinstance(self.character, str): +# return "'%s' codec can't decode byte #x%02x: %s\n" \ +# " in \"%s\", position %d" \ +# % (self.encoding, ord(self.character), self.reason, +# self.name, self.position) +# else: +# return "unacceptable character #x%04x: %s\n" \ +# " in \"%s\", position %d" \ +# % (ord(self.character), self.reason, +# self.name, self.position) +# +#class ScannerError(MarkedYAMLError): +# pass +# +#class ParserError(MarkedYAMLError): +# pass +# +#class EmitterError(YAMLError): +# pass +# +#cdef class Token: +# cdef readonly Mark start_mark +# cdef readonly Mark end_mark +# def __init__(self, Mark start_mark, Mark end_mark): +# self.start_mark = start_mark +# self.end_mark = end_mark +# +#cdef class StreamStartToken(Token): +# cdef readonly object encoding +# def __init__(self, Mark start_mark, Mark end_mark, encoding): +# self.start_mark = start_mark +# self.end_mark = end_mark +# self.encoding = encoding +# +#cdef class StreamEndToken(Token): +# pass +# +#cdef class DirectiveToken(Token): +# cdef readonly object name +# cdef readonly object value +# def __init__(self, name, value, Mark start_mark, Mark end_mark): +# self.name = name +# self.value = value +# self.start_mark = start_mark +# self.end_mark = end_mark +# +#cdef class DocumentStartToken(Token): +# pass +# +#cdef class DocumentEndToken(Token): +# pass +# +#cdef class BlockSequenceStartToken(Token): +# pass +# +#cdef class BlockMappingStartToken(Token): +# pass +# +#cdef class BlockEndToken(Token): +# pass +# +#cdef class FlowSequenceStartToken(Token): +# pass +# +#cdef class FlowMappingStartToken(Token): +# pass +# +#cdef class FlowSequenceEndToken(Token): +# pass +# +#cdef class FlowMappingEndToken(Token): +# pass +# +#cdef class KeyToken(Token): +# pass +# +#cdef class ValueToken(Token): +# pass +# +#cdef class BlockEntryToken(Token): +# pass +# +#cdef class FlowEntryToken(Token): +# pass +# +#cdef class AliasToken(Token): +# cdef readonly object value +# def __init__(self, value, Mark start_mark, Mark end_mark): +# self.value = value +# self.start_mark = start_mark +# self.end_mark = end_mark +# +#cdef class AnchorToken(Token): +# cdef readonly object value +# def __init__(self, value, Mark start_mark, Mark end_mark): +# self.value = value +# self.start_mark = start_mark +# self.end_mark = end_mark +# +#cdef class TagToken(Token): +# cdef readonly object value +# def __init__(self, value, Mark start_mark, Mark end_mark): +# self.value = value +# self.start_mark = start_mark +# self.end_mark = end_mark +# +#cdef class ScalarToken(Token): +# cdef readonly object value +# cdef readonly object plain +# cdef readonly object style +# def __init__(self, value, plain, Mark start_mark, Mark end_mark, style=None): +# self.value = value +# self.plain = plain +# self.start_mark = start_mark +# self.end_mark = end_mark +# self.style = style + +cdef class CParser: + + cdef yaml_parser_t parser + cdef yaml_event_t parsed_event + + cdef object stream + cdef object stream_name + cdef object current_token + cdef object current_event + cdef object anchors + cdef object stream_cache + cdef int stream_cache_len + cdef int stream_cache_pos + cdef int unicode_source + + def __init__(self, stream): + cdef is_readable + if yaml_parser_initialize(&self.parser) == 0: + raise MemoryError + self.parsed_event.type = YAML_NO_EVENT + is_readable = 1 + try: + stream.read + except AttributeError: + is_readable = 0 + self.unicode_source = 0 + if is_readable: + self.stream = stream + try: + self.stream_name = stream.name + except AttributeError: + if PY_MAJOR_VERSION < 3: + self.stream_name = '' + else: + self.stream_name = u'' + self.stream_cache = None + self.stream_cache_len = 0 + self.stream_cache_pos = 0 + yaml_parser_set_input(&self.parser, input_handler, self) + else: + if PyUnicode_CheckExact(stream) != 0: + stream = PyUnicode_AsUTF8String(stream) + if PY_MAJOR_VERSION < 3: + self.stream_name = '' + else: + self.stream_name = u'' + self.unicode_source = 1 + else: + if PY_MAJOR_VERSION < 3: + self.stream_name = '' + else: + self.stream_name = u'' + if PyString_CheckExact(stream) == 0: + if PY_MAJOR_VERSION < 3: + raise TypeError("a string or stream input is required") + else: + raise TypeError(u"a string or stream input is required") + self.stream = stream + yaml_parser_set_input_string(&self.parser, PyString_AS_STRING(stream), PyString_GET_SIZE(stream)) + self.current_token = None + self.current_event = None + self.anchors = {} + + def __dealloc__(self): + yaml_parser_delete(&self.parser) + yaml_event_delete(&self.parsed_event) + + def dispose(self): + pass + + cdef object _parser_error(self): + if self.parser.error == YAML_MEMORY_ERROR: + return MemoryError + elif self.parser.error == YAML_READER_ERROR: + if PY_MAJOR_VERSION < 3: + return ReaderError(self.stream_name, self.parser.problem_offset, + self.parser.problem_value, '?', self.parser.problem) + else: + return ReaderError(self.stream_name, self.parser.problem_offset, + self.parser.problem_value, u'?', PyUnicode_FromString(self.parser.problem)) + elif self.parser.error == YAML_SCANNER_ERROR \ + or self.parser.error == YAML_PARSER_ERROR: + context_mark = None + problem_mark = None + if self.parser.context != NULL: + context_mark = Mark(self.stream_name, + self.parser.context_mark.index, + self.parser.context_mark.line, + self.parser.context_mark.column, None, None) + if self.parser.problem != NULL: + problem_mark = Mark(self.stream_name, + self.parser.problem_mark.index, + self.parser.problem_mark.line, + self.parser.problem_mark.column, None, None) + context = None + if self.parser.context != NULL: + if PY_MAJOR_VERSION < 3: + context = self.parser.context + else: + context = PyUnicode_FromString(self.parser.context) + if PY_MAJOR_VERSION < 3: + problem = self.parser.problem + else: + problem = PyUnicode_FromString(self.parser.problem) + if self.parser.error == YAML_SCANNER_ERROR: + return ScannerError(context, context_mark, problem, problem_mark) + else: + return ParserError(context, context_mark, problem, problem_mark) + if PY_MAJOR_VERSION < 3: + raise ValueError("no parser error") + else: + raise ValueError(u"no parser error") + + def raw_scan(self): + cdef yaml_token_t token + cdef int done + cdef int count + count = 0 + done = 0 + while done == 0: + if yaml_parser_scan(&self.parser, &token) == 0: + error = self._parser_error() + raise error + if token.type == YAML_NO_TOKEN: + done = 1 + else: + count = count+1 + yaml_token_delete(&token) + return count + + cdef object _scan(self): + cdef yaml_token_t token + if yaml_parser_scan(&self.parser, &token) == 0: + error = self._parser_error() + raise error + token_object = self._token_to_object(&token) + yaml_token_delete(&token) + return token_object + + cdef object _token_to_object(self, yaml_token_t *token): + start_mark = Mark(self.stream_name, + token.start_mark.index, + token.start_mark.line, + token.start_mark.column, + None, None) + end_mark = Mark(self.stream_name, + token.end_mark.index, + token.end_mark.line, + token.end_mark.column, + None, None) + if token.type == YAML_NO_TOKEN: + return None + elif token.type == YAML_STREAM_START_TOKEN: + encoding = None + if token.data.stream_start.encoding == YAML_UTF8_ENCODING: + if self.unicode_source == 0: + encoding = u"utf-8" + elif token.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + encoding = u"utf-16-le" + elif token.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + encoding = u"utf-16-be" + return StreamStartToken(start_mark, end_mark, encoding) + elif token.type == YAML_STREAM_END_TOKEN: + return StreamEndToken(start_mark, end_mark) + elif token.type == YAML_VERSION_DIRECTIVE_TOKEN: + return DirectiveToken(u"YAML", + (token.data.version_directive.major, + token.data.version_directive.minor), + start_mark, end_mark) + elif token.type == YAML_TAG_DIRECTIVE_TOKEN: + handle = PyUnicode_FromString(token.data.tag_directive.handle) + prefix = PyUnicode_FromString(token.data.tag_directive.prefix) + return DirectiveToken(u"TAG", (handle, prefix), + start_mark, end_mark) + elif token.type == YAML_DOCUMENT_START_TOKEN: + return DocumentStartToken(start_mark, end_mark) + elif token.type == YAML_DOCUMENT_END_TOKEN: + return DocumentEndToken(start_mark, end_mark) + elif token.type == YAML_BLOCK_SEQUENCE_START_TOKEN: + return BlockSequenceStartToken(start_mark, end_mark) + elif token.type == YAML_BLOCK_MAPPING_START_TOKEN: + return BlockMappingStartToken(start_mark, end_mark) + elif token.type == YAML_BLOCK_END_TOKEN: + return BlockEndToken(start_mark, end_mark) + elif token.type == YAML_FLOW_SEQUENCE_START_TOKEN: + return FlowSequenceStartToken(start_mark, end_mark) + elif token.type == YAML_FLOW_SEQUENCE_END_TOKEN: + return FlowSequenceEndToken(start_mark, end_mark) + elif token.type == YAML_FLOW_MAPPING_START_TOKEN: + return FlowMappingStartToken(start_mark, end_mark) + elif token.type == YAML_FLOW_MAPPING_END_TOKEN: + return FlowMappingEndToken(start_mark, end_mark) + elif token.type == YAML_BLOCK_ENTRY_TOKEN: + return BlockEntryToken(start_mark, end_mark) + elif token.type == YAML_FLOW_ENTRY_TOKEN: + return FlowEntryToken(start_mark, end_mark) + elif token.type == YAML_KEY_TOKEN: + return KeyToken(start_mark, end_mark) + elif token.type == YAML_VALUE_TOKEN: + return ValueToken(start_mark, end_mark) + elif token.type == YAML_ALIAS_TOKEN: + value = PyUnicode_FromString(token.data.alias.value) + return AliasToken(value, start_mark, end_mark) + elif token.type == YAML_ANCHOR_TOKEN: + value = PyUnicode_FromString(token.data.anchor.value) + return AnchorToken(value, start_mark, end_mark) + elif token.type == YAML_TAG_TOKEN: + handle = PyUnicode_FromString(token.data.tag.handle) + suffix = PyUnicode_FromString(token.data.tag.suffix) + if not handle: + handle = None + return TagToken((handle, suffix), start_mark, end_mark) + elif token.type == YAML_SCALAR_TOKEN: + value = PyUnicode_DecodeUTF8(token.data.scalar.value, + token.data.scalar.length, 'strict') + plain = False + style = None + if token.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + plain = True + style = u'' + elif token.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + style = u'\'' + elif token.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + style = u'"' + elif token.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + style = u'|' + elif token.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + style = u'>' + return ScalarToken(value, plain, + start_mark, end_mark, style) + else: + if PY_MAJOR_VERSION < 3: + raise ValueError("unknown token type") + else: + raise ValueError(u"unknown token type") + + def get_token(self): + if self.current_token is not None: + value = self.current_token + self.current_token = None + else: + value = self._scan() + return value + + def peek_token(self): + if self.current_token is None: + self.current_token = self._scan() + return self.current_token + + def check_token(self, *choices): + if self.current_token is None: + self.current_token = self._scan() + if self.current_token is None: + return False + if not choices: + return True + token_class = self.current_token.__class__ + for choice in choices: + if token_class is choice: + return True + return False + + def raw_parse(self): + cdef yaml_event_t event + cdef int done + cdef int count + count = 0 + done = 0 + while done == 0: + if yaml_parser_parse(&self.parser, &event) == 0: + error = self._parser_error() + raise error + if event.type == YAML_NO_EVENT: + done = 1 + else: + count = count+1 + yaml_event_delete(&event) + return count + + cdef object _parse(self): + cdef yaml_event_t event + if yaml_parser_parse(&self.parser, &event) == 0: + error = self._parser_error() + raise error + event_object = self._event_to_object(&event) + yaml_event_delete(&event) + return event_object + + cdef object _event_to_object(self, yaml_event_t *event): + cdef yaml_tag_directive_t *tag_directive + start_mark = Mark(self.stream_name, + event.start_mark.index, + event.start_mark.line, + event.start_mark.column, + None, None) + end_mark = Mark(self.stream_name, + event.end_mark.index, + event.end_mark.line, + event.end_mark.column, + None, None) + if event.type == YAML_NO_EVENT: + return None + elif event.type == YAML_STREAM_START_EVENT: + encoding = None + if event.data.stream_start.encoding == YAML_UTF8_ENCODING: + if self.unicode_source == 0: + encoding = u"utf-8" + elif event.data.stream_start.encoding == YAML_UTF16LE_ENCODING: + encoding = u"utf-16-le" + elif event.data.stream_start.encoding == YAML_UTF16BE_ENCODING: + encoding = u"utf-16-be" + return StreamStartEvent(start_mark, end_mark, encoding) + elif event.type == YAML_STREAM_END_EVENT: + return StreamEndEvent(start_mark, end_mark) + elif event.type == YAML_DOCUMENT_START_EVENT: + explicit = False + if event.data.document_start.implicit == 0: + explicit = True + version = None + if event.data.document_start.version_directive != NULL: + version = (event.data.document_start.version_directive.major, + event.data.document_start.version_directive.minor) + tags = None + if event.data.document_start.tag_directives.start != NULL: + tags = {} + tag_directive = event.data.document_start.tag_directives.start + while tag_directive != event.data.document_start.tag_directives.end: + handle = PyUnicode_FromString(tag_directive.handle) + prefix = PyUnicode_FromString(tag_directive.prefix) + tags[handle] = prefix + tag_directive = tag_directive+1 + return DocumentStartEvent(start_mark, end_mark, + explicit, version, tags) + elif event.type == YAML_DOCUMENT_END_EVENT: + explicit = False + if event.data.document_end.implicit == 0: + explicit = True + return DocumentEndEvent(start_mark, end_mark, explicit) + elif event.type == YAML_ALIAS_EVENT: + anchor = PyUnicode_FromString(event.data.alias.anchor) + return AliasEvent(anchor, start_mark, end_mark) + elif event.type == YAML_SCALAR_EVENT: + anchor = None + if event.data.scalar.anchor != NULL: + anchor = PyUnicode_FromString(event.data.scalar.anchor) + tag = None + if event.data.scalar.tag != NULL: + tag = PyUnicode_FromString(event.data.scalar.tag) + value = PyUnicode_DecodeUTF8(event.data.scalar.value, + event.data.scalar.length, 'strict') + plain_implicit = False + if event.data.scalar.plain_implicit == 1: + plain_implicit = True + quoted_implicit = False + if event.data.scalar.quoted_implicit == 1: + quoted_implicit = True + style = None + if event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + style = u'' + elif event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + style = u'\'' + elif event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + style = u'"' + elif event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + style = u'|' + elif event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + style = u'>' + return ScalarEvent(anchor, tag, + (plain_implicit, quoted_implicit), + value, start_mark, end_mark, style) + elif event.type == YAML_SEQUENCE_START_EVENT: + anchor = None + if event.data.sequence_start.anchor != NULL: + anchor = PyUnicode_FromString(event.data.sequence_start.anchor) + tag = None + if event.data.sequence_start.tag != NULL: + tag = PyUnicode_FromString(event.data.sequence_start.tag) + implicit = False + if event.data.sequence_start.implicit == 1: + implicit = True + flow_style = None + if event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + flow_style = True + elif event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + flow_style = False + return SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style) + elif event.type == YAML_MAPPING_START_EVENT: + anchor = None + if event.data.mapping_start.anchor != NULL: + anchor = PyUnicode_FromString(event.data.mapping_start.anchor) + tag = None + if event.data.mapping_start.tag != NULL: + tag = PyUnicode_FromString(event.data.mapping_start.tag) + implicit = False + if event.data.mapping_start.implicit == 1: + implicit = True + flow_style = None + if event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + flow_style = True + elif event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + flow_style = False + return MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style) + elif event.type == YAML_SEQUENCE_END_EVENT: + return SequenceEndEvent(start_mark, end_mark) + elif event.type == YAML_MAPPING_END_EVENT: + return MappingEndEvent(start_mark, end_mark) + else: + if PY_MAJOR_VERSION < 3: + raise ValueError("unknown event type") + else: + raise ValueError(u"unknown event type") + + def get_event(self): + if self.current_event is not None: + value = self.current_event + self.current_event = None + else: + value = self._parse() + return value + + def peek_event(self): + if self.current_event is None: + self.current_event = self._parse() + return self.current_event + + def check_event(self, *choices): + if self.current_event is None: + self.current_event = self._parse() + if self.current_event is None: + return False + if not choices: + return True + event_class = self.current_event.__class__ + for choice in choices: + if event_class is choice: + return True + return False + + def check_node(self): + self._parse_next_event() + if self.parsed_event.type == YAML_STREAM_START_EVENT: + yaml_event_delete(&self.parsed_event) + self._parse_next_event() + if self.parsed_event.type != YAML_STREAM_END_EVENT: + return True + return False + + def get_node(self): + self._parse_next_event() + if self.parsed_event.type != YAML_STREAM_END_EVENT: + return self._compose_document() + + def get_single_node(self): + self._parse_next_event() + yaml_event_delete(&self.parsed_event) + self._parse_next_event() + document = None + if self.parsed_event.type != YAML_STREAM_END_EVENT: + document = self._compose_document() + self._parse_next_event() + if self.parsed_event.type != YAML_STREAM_END_EVENT: + mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + if PY_MAJOR_VERSION < 3: + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", mark) + else: + raise ComposerError(u"expected a single document in the stream", + document.start_mark, u"but found another document", mark) + return document + + cdef object _compose_document(self): + yaml_event_delete(&self.parsed_event) + node = self._compose_node(None, None) + self._parse_next_event() + yaml_event_delete(&self.parsed_event) + self.anchors = {} + return node + + cdef object _compose_node(self, object parent, object index): + self._parse_next_event() + if self.parsed_event.type == YAML_ALIAS_EVENT: + anchor = PyUnicode_FromString(self.parsed_event.data.alias.anchor) + if anchor not in self.anchors: + mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + if PY_MAJOR_VERSION < 3: + raise ComposerError(None, None, "found undefined alias", mark) + else: + raise ComposerError(None, None, u"found undefined alias", mark) + yaml_event_delete(&self.parsed_event) + return self.anchors[anchor] + anchor = None + if self.parsed_event.type == YAML_SCALAR_EVENT \ + and self.parsed_event.data.scalar.anchor != NULL: + anchor = PyUnicode_FromString(self.parsed_event.data.scalar.anchor) + elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT \ + and self.parsed_event.data.sequence_start.anchor != NULL: + anchor = PyUnicode_FromString(self.parsed_event.data.sequence_start.anchor) + elif self.parsed_event.type == YAML_MAPPING_START_EVENT \ + and self.parsed_event.data.mapping_start.anchor != NULL: + anchor = PyUnicode_FromString(self.parsed_event.data.mapping_start.anchor) + if anchor is not None: + if anchor in self.anchors: + mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + if PY_MAJOR_VERSION < 3: + raise ComposerError("found duplicate anchor; first occurence", + self.anchors[anchor].start_mark, "second occurence", mark) + else: + raise ComposerError(u"found duplicate anchor; first occurence", + self.anchors[anchor].start_mark, u"second occurence", mark) + self.descend_resolver(parent, index) + if self.parsed_event.type == YAML_SCALAR_EVENT: + node = self._compose_scalar_node(anchor) + elif self.parsed_event.type == YAML_SEQUENCE_START_EVENT: + node = self._compose_sequence_node(anchor) + elif self.parsed_event.type == YAML_MAPPING_START_EVENT: + node = self._compose_mapping_node(anchor) + self.ascend_resolver() + return node + + cdef _compose_scalar_node(self, object anchor): + start_mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + end_mark = Mark(self.stream_name, + self.parsed_event.end_mark.index, + self.parsed_event.end_mark.line, + self.parsed_event.end_mark.column, + None, None) + value = PyUnicode_DecodeUTF8(self.parsed_event.data.scalar.value, + self.parsed_event.data.scalar.length, 'strict') + plain_implicit = False + if self.parsed_event.data.scalar.plain_implicit == 1: + plain_implicit = True + quoted_implicit = False + if self.parsed_event.data.scalar.quoted_implicit == 1: + quoted_implicit = True + if self.parsed_event.data.scalar.tag == NULL \ + or (self.parsed_event.data.scalar.tag[0] == c'!' + and self.parsed_event.data.scalar.tag[1] == c'\0'): + tag = self.resolve(ScalarNode, value, (plain_implicit, quoted_implicit)) + else: + tag = PyUnicode_FromString(self.parsed_event.data.scalar.tag) + style = None + if self.parsed_event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE: + style = u'' + elif self.parsed_event.data.scalar.style == YAML_SINGLE_QUOTED_SCALAR_STYLE: + style = u'\'' + elif self.parsed_event.data.scalar.style == YAML_DOUBLE_QUOTED_SCALAR_STYLE: + style = u'"' + elif self.parsed_event.data.scalar.style == YAML_LITERAL_SCALAR_STYLE: + style = u'|' + elif self.parsed_event.data.scalar.style == YAML_FOLDED_SCALAR_STYLE: + style = u'>' + node = ScalarNode(tag, value, start_mark, end_mark, style) + if anchor is not None: + self.anchors[anchor] = node + yaml_event_delete(&self.parsed_event) + return node + + cdef _compose_sequence_node(self, object anchor): + cdef int index + start_mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + implicit = False + if self.parsed_event.data.sequence_start.implicit == 1: + implicit = True + if self.parsed_event.data.sequence_start.tag == NULL \ + or (self.parsed_event.data.sequence_start.tag[0] == c'!' + and self.parsed_event.data.sequence_start.tag[1] == c'\0'): + tag = self.resolve(SequenceNode, None, implicit) + else: + tag = PyUnicode_FromString(self.parsed_event.data.sequence_start.tag) + flow_style = None + if self.parsed_event.data.sequence_start.style == YAML_FLOW_SEQUENCE_STYLE: + flow_style = True + elif self.parsed_event.data.sequence_start.style == YAML_BLOCK_SEQUENCE_STYLE: + flow_style = False + value = [] + node = SequenceNode(tag, value, start_mark, None, flow_style) + if anchor is not None: + self.anchors[anchor] = node + yaml_event_delete(&self.parsed_event) + index = 0 + self._parse_next_event() + while self.parsed_event.type != YAML_SEQUENCE_END_EVENT: + value.append(self._compose_node(node, index)) + index = index+1 + self._parse_next_event() + node.end_mark = Mark(self.stream_name, + self.parsed_event.end_mark.index, + self.parsed_event.end_mark.line, + self.parsed_event.end_mark.column, + None, None) + yaml_event_delete(&self.parsed_event) + return node + + cdef _compose_mapping_node(self, object anchor): + start_mark = Mark(self.stream_name, + self.parsed_event.start_mark.index, + self.parsed_event.start_mark.line, + self.parsed_event.start_mark.column, + None, None) + implicit = False + if self.parsed_event.data.mapping_start.implicit == 1: + implicit = True + if self.parsed_event.data.mapping_start.tag == NULL \ + or (self.parsed_event.data.mapping_start.tag[0] == c'!' + and self.parsed_event.data.mapping_start.tag[1] == c'\0'): + tag = self.resolve(MappingNode, None, implicit) + else: + tag = PyUnicode_FromString(self.parsed_event.data.mapping_start.tag) + flow_style = None + if self.parsed_event.data.mapping_start.style == YAML_FLOW_MAPPING_STYLE: + flow_style = True + elif self.parsed_event.data.mapping_start.style == YAML_BLOCK_MAPPING_STYLE: + flow_style = False + value = [] + node = MappingNode(tag, value, start_mark, None, flow_style) + if anchor is not None: + self.anchors[anchor] = node + yaml_event_delete(&self.parsed_event) + self._parse_next_event() + while self.parsed_event.type != YAML_MAPPING_END_EVENT: + item_key = self._compose_node(node, None) + item_value = self._compose_node(node, item_key) + value.append((item_key, item_value)) + self._parse_next_event() + node.end_mark = Mark(self.stream_name, + self.parsed_event.end_mark.index, + self.parsed_event.end_mark.line, + self.parsed_event.end_mark.column, + None, None) + yaml_event_delete(&self.parsed_event) + return node + + cdef int _parse_next_event(self) except 0: + if self.parsed_event.type == YAML_NO_EVENT: + if yaml_parser_parse(&self.parser, &self.parsed_event) == 0: + error = self._parser_error() + raise error + return 1 + +cdef int input_handler(void *data, char *buffer, int size, int *read) except 0: + cdef CParser parser + parser = data + if parser.stream_cache is None: + value = parser.stream.read(size) + if PyUnicode_CheckExact(value) != 0: + value = PyUnicode_AsUTF8String(value) + parser.unicode_source = 1 + if PyString_CheckExact(value) == 0: + if PY_MAJOR_VERSION < 3: + raise TypeError("a string value is expected") + else: + raise TypeError(u"a string value is expected") + parser.stream_cache = value + parser.stream_cache_pos = 0 + parser.stream_cache_len = PyString_GET_SIZE(value) + if (parser.stream_cache_len - parser.stream_cache_pos) < size: + size = parser.stream_cache_len - parser.stream_cache_pos + if size > 0: + memcpy(buffer, PyString_AS_STRING(parser.stream_cache) + + parser.stream_cache_pos, size) + read[0] = size + parser.stream_cache_pos += size + if parser.stream_cache_pos == parser.stream_cache_len: + parser.stream_cache = None + return 1 + +cdef class CEmitter: + + cdef yaml_emitter_t emitter + + cdef object stream + + cdef int document_start_implicit + cdef int document_end_implicit + cdef object use_version + cdef object use_tags + + cdef object serialized_nodes + cdef object anchors + cdef int last_alias_id + cdef int closed + cdef int dump_unicode + cdef object use_encoding + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + if yaml_emitter_initialize(&self.emitter) == 0: + raise MemoryError + self.stream = stream + self.dump_unicode = 0 + if PY_MAJOR_VERSION < 3: + if getattr3(stream, 'encoding', None): + self.dump_unicode = 1 + else: + if hasattr(stream, u'encoding'): + self.dump_unicode = 1 + self.use_encoding = encoding + yaml_emitter_set_output(&self.emitter, output_handler, self) + if canonical: + yaml_emitter_set_canonical(&self.emitter, 1) + if indent is not None: + yaml_emitter_set_indent(&self.emitter, indent) + if width is not None: + yaml_emitter_set_width(&self.emitter, width) + if allow_unicode: + yaml_emitter_set_unicode(&self.emitter, 1) + if line_break is not None: + if line_break == '\r': + yaml_emitter_set_break(&self.emitter, YAML_CR_BREAK) + elif line_break == '\n': + yaml_emitter_set_break(&self.emitter, YAML_LN_BREAK) + elif line_break == '\r\n': + yaml_emitter_set_break(&self.emitter, YAML_CRLN_BREAK) + self.document_start_implicit = 1 + if explicit_start: + self.document_start_implicit = 0 + self.document_end_implicit = 1 + if explicit_end: + self.document_end_implicit = 0 + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_alias_id = 0 + self.closed = -1 + + def __dealloc__(self): + yaml_emitter_delete(&self.emitter) + + def dispose(self): + pass + + cdef object _emitter_error(self): + if self.emitter.error == YAML_MEMORY_ERROR: + return MemoryError + elif self.emitter.error == YAML_EMITTER_ERROR: + if PY_MAJOR_VERSION < 3: + problem = self.emitter.problem + else: + problem = PyUnicode_FromString(self.emitter.problem) + return EmitterError(problem) + if PY_MAJOR_VERSION < 3: + raise ValueError("no emitter error") + else: + raise ValueError(u"no emitter error") + + cdef int _object_to_event(self, object event_object, yaml_event_t *event) except 0: + cdef yaml_encoding_t encoding + cdef yaml_version_directive_t version_directive_value + cdef yaml_version_directive_t *version_directive + cdef yaml_tag_directive_t tag_directives_value[128] + cdef yaml_tag_directive_t *tag_directives_start + cdef yaml_tag_directive_t *tag_directives_end + cdef int implicit + cdef int plain_implicit + cdef int quoted_implicit + cdef char *anchor + cdef char *tag + cdef char *value + cdef int length + cdef yaml_scalar_style_t scalar_style + cdef yaml_sequence_style_t sequence_style + cdef yaml_mapping_style_t mapping_style + event_class = event_object.__class__ + if event_class is StreamStartEvent: + encoding = YAML_UTF8_ENCODING + if event_object.encoding == u'utf-16-le' or event_object.encoding == 'utf-16-le': + encoding = YAML_UTF16LE_ENCODING + elif event_object.encoding == u'utf-16-be' or event_object.encoding == 'utf-16-be': + encoding = YAML_UTF16BE_ENCODING + if event_object.encoding is None: + self.dump_unicode = 1 + if self.dump_unicode == 1: + encoding = YAML_UTF8_ENCODING + yaml_stream_start_event_initialize(event, encoding) + elif event_class is StreamEndEvent: + yaml_stream_end_event_initialize(event) + elif event_class is DocumentStartEvent: + version_directive = NULL + if event_object.version: + version_directive_value.major = event_object.version[0] + version_directive_value.minor = event_object.version[1] + version_directive = &version_directive_value + tag_directives_start = NULL + tag_directives_end = NULL + if event_object.tags: + if len(event_object.tags) > 128: + if PY_MAJOR_VERSION < 3: + raise ValueError("too many tags") + else: + raise ValueError(u"too many tags") + tag_directives_start = tag_directives_value + tag_directives_end = tag_directives_value + cache = [] + for handle in event_object.tags: + prefix = event_object.tags[handle] + if PyUnicode_CheckExact(handle): + handle = PyUnicode_AsUTF8String(handle) + cache.append(handle) + if not PyString_CheckExact(handle): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag handle must be a string") + else: + raise TypeError(u"tag handle must be a string") + tag_directives_end.handle = PyString_AS_STRING(handle) + if PyUnicode_CheckExact(prefix): + prefix = PyUnicode_AsUTF8String(prefix) + cache.append(prefix) + if not PyString_CheckExact(prefix): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag prefix must be a string") + else: + raise TypeError(u"tag prefix must be a string") + tag_directives_end.prefix = PyString_AS_STRING(prefix) + tag_directives_end = tag_directives_end+1 + implicit = 1 + if event_object.explicit: + implicit = 0 + if yaml_document_start_event_initialize(event, version_directive, + tag_directives_start, tag_directives_end, implicit) == 0: + raise MemoryError + elif event_class is DocumentEndEvent: + implicit = 1 + if event_object.explicit: + implicit = 0 + yaml_document_end_event_initialize(event, implicit) + elif event_class is AliasEvent: + anchor = NULL + anchor_object = event_object.anchor + if PyUnicode_CheckExact(anchor_object): + anchor_object = PyUnicode_AsUTF8String(anchor_object) + if not PyString_CheckExact(anchor_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("anchor must be a string") + else: + raise TypeError(u"anchor must be a string") + anchor = PyString_AS_STRING(anchor_object) + if yaml_alias_event_initialize(event, anchor) == 0: + raise MemoryError + elif event_class is ScalarEvent: + anchor = NULL + anchor_object = event_object.anchor + if anchor_object is not None: + if PyUnicode_CheckExact(anchor_object): + anchor_object = PyUnicode_AsUTF8String(anchor_object) + if not PyString_CheckExact(anchor_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("anchor must be a string") + else: + raise TypeError(u"anchor must be a string") + anchor = PyString_AS_STRING(anchor_object) + tag = NULL + tag_object = event_object.tag + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + value_object = event_object.value + if PyUnicode_CheckExact(value_object): + value_object = PyUnicode_AsUTF8String(value_object) + if not PyString_CheckExact(value_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("value must be a string") + else: + raise TypeError(u"value must be a string") + value = PyString_AS_STRING(value_object) + length = PyString_GET_SIZE(value_object) + plain_implicit = 0 + quoted_implicit = 0 + if event_object.implicit is not None: + plain_implicit = event_object.implicit[0] + quoted_implicit = event_object.implicit[1] + style_object = event_object.style + scalar_style = YAML_PLAIN_SCALAR_STYLE + if style_object == "'" or style_object == u"'": + scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + elif style_object == "\"" or style_object == u"\"": + scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + elif style_object == "|" or style_object == u"|": + scalar_style = YAML_LITERAL_SCALAR_STYLE + elif style_object == ">" or style_object == u">": + scalar_style = YAML_FOLDED_SCALAR_STYLE + if yaml_scalar_event_initialize(event, anchor, tag, value, length, + plain_implicit, quoted_implicit, scalar_style) == 0: + raise MemoryError + elif event_class is SequenceStartEvent: + anchor = NULL + anchor_object = event_object.anchor + if anchor_object is not None: + if PyUnicode_CheckExact(anchor_object): + anchor_object = PyUnicode_AsUTF8String(anchor_object) + if not PyString_CheckExact(anchor_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("anchor must be a string") + else: + raise TypeError(u"anchor must be a string") + anchor = PyString_AS_STRING(anchor_object) + tag = NULL + tag_object = event_object.tag + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + implicit = 0 + if event_object.implicit: + implicit = 1 + sequence_style = YAML_BLOCK_SEQUENCE_STYLE + if event_object.flow_style: + sequence_style = YAML_FLOW_SEQUENCE_STYLE + if yaml_sequence_start_event_initialize(event, anchor, tag, + implicit, sequence_style) == 0: + raise MemoryError + elif event_class is MappingStartEvent: + anchor = NULL + anchor_object = event_object.anchor + if anchor_object is not None: + if PyUnicode_CheckExact(anchor_object): + anchor_object = PyUnicode_AsUTF8String(anchor_object) + if not PyString_CheckExact(anchor_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("anchor must be a string") + else: + raise TypeError(u"anchor must be a string") + anchor = PyString_AS_STRING(anchor_object) + tag = NULL + tag_object = event_object.tag + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + implicit = 0 + if event_object.implicit: + implicit = 1 + mapping_style = YAML_BLOCK_MAPPING_STYLE + if event_object.flow_style: + mapping_style = YAML_FLOW_MAPPING_STYLE + if yaml_mapping_start_event_initialize(event, anchor, tag, + implicit, mapping_style) == 0: + raise MemoryError + elif event_class is SequenceEndEvent: + yaml_sequence_end_event_initialize(event) + elif event_class is MappingEndEvent: + yaml_mapping_end_event_initialize(event) + else: + if PY_MAJOR_VERSION < 3: + raise TypeError("invalid event %s" % event_object) + else: + raise TypeError(u"invalid event %s" % event_object) + return 1 + + def emit(self, event_object): + cdef yaml_event_t event + self._object_to_event(event_object, &event) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + + def open(self): + cdef yaml_event_t event + cdef yaml_encoding_t encoding + if self.closed == -1: + if self.use_encoding == u'utf-16-le' or self.use_encoding == 'utf-16-le': + encoding = YAML_UTF16LE_ENCODING + elif self.use_encoding == u'utf-16-be' or self.use_encoding == 'utf-16-be': + encoding = YAML_UTF16BE_ENCODING + else: + encoding = YAML_UTF8_ENCODING + if self.use_encoding is None: + self.dump_unicode = 1 + if self.dump_unicode == 1: + encoding = YAML_UTF8_ENCODING + yaml_stream_start_event_initialize(&event, encoding) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + self.closed = 0 + elif self.closed == 1: + if PY_MAJOR_VERSION < 3: + raise SerializerError("serializer is closed") + else: + raise SerializerError(u"serializer is closed") + else: + if PY_MAJOR_VERSION < 3: + raise SerializerError("serializer is already opened") + else: + raise SerializerError(u"serializer is already opened") + + def close(self): + cdef yaml_event_t event + if self.closed == -1: + if PY_MAJOR_VERSION < 3: + raise SerializerError("serializer is not opened") + else: + raise SerializerError(u"serializer is not opened") + elif self.closed == 0: + yaml_stream_end_event_initialize(&event) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + self.closed = 1 + + def serialize(self, node): + cdef yaml_event_t event + cdef yaml_version_directive_t version_directive_value + cdef yaml_version_directive_t *version_directive + cdef yaml_tag_directive_t tag_directives_value[128] + cdef yaml_tag_directive_t *tag_directives_start + cdef yaml_tag_directive_t *tag_directives_end + if self.closed == -1: + if PY_MAJOR_VERSION < 3: + raise SerializerError("serializer is not opened") + else: + raise SerializerError(u"serializer is not opened") + elif self.closed == 1: + if PY_MAJOR_VERSION < 3: + raise SerializerError("serializer is closed") + else: + raise SerializerError(u"serializer is closed") + cache = [] + version_directive = NULL + if self.use_version: + version_directive_value.major = self.use_version[0] + version_directive_value.minor = self.use_version[1] + version_directive = &version_directive_value + tag_directives_start = NULL + tag_directives_end = NULL + if self.use_tags: + if len(self.use_tags) > 128: + if PY_MAJOR_VERSION < 3: + raise ValueError("too many tags") + else: + raise ValueError(u"too many tags") + tag_directives_start = tag_directives_value + tag_directives_end = tag_directives_value + for handle in self.use_tags: + prefix = self.use_tags[handle] + if PyUnicode_CheckExact(handle): + handle = PyUnicode_AsUTF8String(handle) + cache.append(handle) + if not PyString_CheckExact(handle): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag handle must be a string") + else: + raise TypeError(u"tag handle must be a string") + tag_directives_end.handle = PyString_AS_STRING(handle) + if PyUnicode_CheckExact(prefix): + prefix = PyUnicode_AsUTF8String(prefix) + cache.append(prefix) + if not PyString_CheckExact(prefix): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag prefix must be a string") + else: + raise TypeError(u"tag prefix must be a string") + tag_directives_end.prefix = PyString_AS_STRING(prefix) + tag_directives_end = tag_directives_end+1 + if yaml_document_start_event_initialize(&event, version_directive, + tag_directives_start, tag_directives_end, + self.document_start_implicit) == 0: + raise MemoryError + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + self._anchor_node(node) + self._serialize_node(node, None, None) + yaml_document_end_event_initialize(&event, self.document_end_implicit) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + self.serialized_nodes = {} + self.anchors = {} + self.last_alias_id = 0 + + cdef int _anchor_node(self, object node) except 0: + if node in self.anchors: + if self.anchors[node] is None: + self.last_alias_id = self.last_alias_id+1 + self.anchors[node] = u"id%03d" % self.last_alias_id + else: + self.anchors[node] = None + node_class = node.__class__ + if node_class is SequenceNode: + for item in node.value: + self._anchor_node(item) + elif node_class is MappingNode: + for key, value in node.value: + self._anchor_node(key) + self._anchor_node(value) + return 1 + + cdef int _serialize_node(self, object node, object parent, object index) except 0: + cdef yaml_event_t event + cdef int implicit + cdef int plain_implicit + cdef int quoted_implicit + cdef char *anchor + cdef char *tag + cdef char *value + cdef int length + cdef int item_index + cdef yaml_scalar_style_t scalar_style + cdef yaml_sequence_style_t sequence_style + cdef yaml_mapping_style_t mapping_style + anchor_object = self.anchors[node] + anchor = NULL + if anchor_object is not None: + if PyUnicode_CheckExact(anchor_object): + anchor_object = PyUnicode_AsUTF8String(anchor_object) + if not PyString_CheckExact(anchor_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("anchor must be a string") + else: + raise TypeError(u"anchor must be a string") + anchor = PyString_AS_STRING(anchor_object) + if node in self.serialized_nodes: + if yaml_alias_event_initialize(&event, anchor) == 0: + raise MemoryError + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + else: + node_class = node.__class__ + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if node_class is ScalarNode: + plain_implicit = 0 + quoted_implicit = 0 + tag_object = node.tag + if self.resolve(ScalarNode, node.value, (True, False)) == tag_object: + plain_implicit = 1 + if self.resolve(ScalarNode, node.value, (False, True)) == tag_object: + quoted_implicit = 1 + tag = NULL + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + value_object = node.value + if PyUnicode_CheckExact(value_object): + value_object = PyUnicode_AsUTF8String(value_object) + if not PyString_CheckExact(value_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("value must be a string") + else: + raise TypeError(u"value must be a string") + value = PyString_AS_STRING(value_object) + length = PyString_GET_SIZE(value_object) + style_object = node.style + scalar_style = YAML_PLAIN_SCALAR_STYLE + if style_object == "'" or style_object == u"'": + scalar_style = YAML_SINGLE_QUOTED_SCALAR_STYLE + elif style_object == "\"" or style_object == u"\"": + scalar_style = YAML_DOUBLE_QUOTED_SCALAR_STYLE + elif style_object == "|" or style_object == u"|": + scalar_style = YAML_LITERAL_SCALAR_STYLE + elif style_object == ">" or style_object == u">": + scalar_style = YAML_FOLDED_SCALAR_STYLE + if yaml_scalar_event_initialize(&event, anchor, tag, value, length, + plain_implicit, quoted_implicit, scalar_style) == 0: + raise MemoryError + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + elif node_class is SequenceNode: + implicit = 0 + tag_object = node.tag + if self.resolve(SequenceNode, node.value, True) == tag_object: + implicit = 1 + tag = NULL + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + sequence_style = YAML_BLOCK_SEQUENCE_STYLE + if node.flow_style: + sequence_style = YAML_FLOW_SEQUENCE_STYLE + if yaml_sequence_start_event_initialize(&event, anchor, tag, + implicit, sequence_style) == 0: + raise MemoryError + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + item_index = 0 + for item in node.value: + self._serialize_node(item, node, item_index) + item_index = item_index+1 + yaml_sequence_end_event_initialize(&event) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + elif node_class is MappingNode: + implicit = 0 + tag_object = node.tag + if self.resolve(MappingNode, node.value, True) == tag_object: + implicit = 1 + tag = NULL + if tag_object is not None: + if PyUnicode_CheckExact(tag_object): + tag_object = PyUnicode_AsUTF8String(tag_object) + if not PyString_CheckExact(tag_object): + if PY_MAJOR_VERSION < 3: + raise TypeError("tag must be a string") + else: + raise TypeError(u"tag must be a string") + tag = PyString_AS_STRING(tag_object) + mapping_style = YAML_BLOCK_MAPPING_STYLE + if node.flow_style: + mapping_style = YAML_FLOW_MAPPING_STYLE + if yaml_mapping_start_event_initialize(&event, anchor, tag, + implicit, mapping_style) == 0: + raise MemoryError + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + for item_key, item_value in node.value: + self._serialize_node(item_key, node, None) + self._serialize_node(item_value, node, item_key) + yaml_mapping_end_event_initialize(&event) + if yaml_emitter_emit(&self.emitter, &event) == 0: + error = self._emitter_error() + raise error + self.ascend_resolver() + return 1 + +cdef int output_handler(void *data, char *buffer, int size) except 0: + cdef CEmitter emitter + emitter = data + if emitter.dump_unicode == 0: + value = PyString_FromStringAndSize(buffer, size) + else: + value = PyUnicode_DecodeUTF8(buffer, size, 'strict') + emitter.stream.write(value) + return 1 + diff --git a/python/pyyaml/lib/yaml/__init__.py b/python/pyyaml/lib/yaml/__init__.py new file mode 100644 index 000000000000..76e19e13f1ad --- /dev/null +++ b/python/pyyaml/lib/yaml/__init__.py @@ -0,0 +1,315 @@ + +from error import * + +from tokens import * +from events import * +from nodes import * + +from loader import * +from dumper import * + +__version__ = '3.11' + +try: + from cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + Resolve only basic YAML tags. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + Resolve only basic YAML tags. + """ + return load_all(stream, SafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + from StringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding='utf-8', explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + from StringIO import StringIO + else: + from cStringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding='utf-8', explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + from StringIO import StringIO + else: + from cStringIO import StringIO + stream = StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=Loader, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=Loader): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(object): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __metaclass__ = YAMLObjectMetaclass + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = Loader + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + from_yaml = classmethod(from_yaml) + + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + to_yaml = classmethod(to_yaml) + diff --git a/python/pyyaml/lib/yaml/composer.py b/python/pyyaml/lib/yaml/composer.py new file mode 100644 index 000000000000..06e5ac782f1a --- /dev/null +++ b/python/pyyaml/lib/yaml/composer.py @@ -0,0 +1,139 @@ + +__all__ = ['Composer', 'ComposerError'] + +from error import MarkedYAMLError +from events import * +from nodes import * + +class ComposerError(MarkedYAMLError): + pass + +class Composer(object): + + def __init__(self): + self.anchors = {} + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(StreamEndEvent): + event = self.get_event() + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", + event.start_mark) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + self.anchors = {} + return node + + def compose_node(self, parent, index): + if self.check_event(AliasEvent): + event = self.get_event() + anchor = event.anchor + if anchor not in self.anchors: + raise ComposerError(None, None, "found undefined alias %r" + % anchor.encode('utf-8'), event.start_mark) + return self.anchors[anchor] + event = self.peek_event() + anchor = event.anchor + if anchor is not None: + if anchor in self.anchors: + raise ComposerError("found duplicate anchor %r; first occurence" + % anchor.encode('utf-8'), self.anchors[anchor].start_mark, + "second occurence", event.start_mark) + self.descend_resolver(parent, index) + if self.check_event(ScalarEvent): + node = self.compose_scalar_node(anchor) + elif self.check_event(SequenceStartEvent): + node = self.compose_sequence_node(anchor) + elif self.check_event(MappingStartEvent): + node = self.compose_mapping_node(anchor) + self.ascend_resolver() + return node + + def compose_scalar_node(self, anchor): + event = self.get_event() + tag = event.tag + if tag is None or tag == u'!': + tag = self.resolve(ScalarNode, event.value, event.implicit) + node = ScalarNode(tag, event.value, + event.start_mark, event.end_mark, style=event.style) + if anchor is not None: + self.anchors[anchor] = node + return node + + def compose_sequence_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == u'!': + tag = self.resolve(SequenceNode, None, start_event.implicit) + node = SequenceNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + index = 0 + while not self.check_event(SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == u'!': + tag = self.resolve(MappingNode, None, start_event.implicit) + node = MappingNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + while not self.check_event(MappingEndEvent): + #key_event = self.peek_event() + item_key = self.compose_node(node, None) + #if item_key in node.value: + # raise ComposerError("while composing a mapping", start_event.start_mark, + # "found duplicate key", key_event.start_mark) + item_value = self.compose_node(node, item_key) + #node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + diff --git a/python/pyyaml/lib/yaml/constructor.py b/python/pyyaml/lib/yaml/constructor.py new file mode 100644 index 000000000000..635faac3e6fe --- /dev/null +++ b/python/pyyaml/lib/yaml/constructor.py @@ -0,0 +1,675 @@ + +__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', + 'ConstructorError'] + +from error import * +from nodes import * + +import datetime + +import binascii, re, sys, types + +class ConstructorError(MarkedYAMLError): + pass + +class BaseConstructor(object): + + yaml_constructors = {} + yaml_multi_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.recursive_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.recursive_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + if node in self.recursive_objects: + raise ConstructorError(None, None, + "found unconstructable recursive node", node.start_mark) + self.recursive_objects[node] = None + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + for tag_prefix in self.yaml_multi_constructors: + if node.tag.startswith(tag_prefix): + tag_suffix = node.tag[len(tag_prefix):] + constructor = self.yaml_multi_constructors[tag_prefix] + break + else: + if None in self.yaml_multi_constructors: + tag_suffix = node.tag + constructor = self.yaml_multi_constructors[None] + elif None in self.yaml_constructors: + constructor = self.yaml_constructors[None] + elif isinstance(node, ScalarNode): + constructor = self.__class__.construct_scalar + elif isinstance(node, SequenceNode): + constructor = self.__class__.construct_sequence + elif isinstance(node, MappingNode): + constructor = self.__class__.construct_mapping + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = generator.next() + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + del self.recursive_objects[node] + if deep: + self.deep_construct = old_deep + return data + + def construct_scalar(self, node): + if not isinstance(node, ScalarNode): + raise ConstructorError(None, None, + "expected a scalar node, but found %s" % node.id, + node.start_mark) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, SequenceNode): + raise ConstructorError(None, None, + "expected a sequence node, but found %s" % node.id, + node.start_mark) + return [self.construct_object(child, deep=deep) + for child in node.value] + + def construct_mapping(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + try: + hash(key) + except TypeError, exc: + raise ConstructorError("while constructing a mapping", node.start_mark, + "found unacceptable key (%s)" % exc, key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + def construct_pairs(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + pairs = [] + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + value = self.construct_object(value_node, deep=deep) + pairs.append((key, value)) + return pairs + + def add_constructor(cls, tag, constructor): + if not 'yaml_constructors' in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + add_constructor = classmethod(add_constructor) + + def add_multi_constructor(cls, tag_prefix, multi_constructor): + if not 'yaml_multi_constructors' in cls.__dict__: + cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() + cls.yaml_multi_constructors[tag_prefix] = multi_constructor + add_multi_constructor = classmethod(add_multi_constructor) + +class SafeConstructor(BaseConstructor): + + def construct_scalar(self, node): + if isinstance(node, MappingNode): + for key_node, value_node in node.value: + if key_node.tag == u'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return BaseConstructor.construct_scalar(self, node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == u'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing a mapping", + node.start_mark, + "expected a mapping for merging, but found %s" + % subnode.id, subnode.start_mark) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError("while constructing a mapping", node.start_mark, + "expected a mapping or list of mappings for merging, but found %s" + % value_node.id, value_node.start_mark) + elif key_node.tag == u'tag:yaml.org,2002:value': + key_node.tag = u'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, MappingNode): + self.flatten_mapping(node) + return BaseConstructor.construct_mapping(self, node, deep=deep) + + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + bool_values = { + u'yes': True, + u'no': False, + u'true': True, + u'false': False, + u'on': True, + u'off': False, + } + + def construct_yaml_bool(self, node): + value = self.construct_scalar(node) + return self.bool_values[value.lower()] + + def construct_yaml_int(self, node): + value = str(self.construct_scalar(node)) + value = value.replace('_', '') + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + elif value.startswith('0b'): + return sign*int(value[2:], 2) + elif value.startswith('0x'): + return sign*int(value[2:], 16) + elif value[0] == '0': + return sign*int(value, 8) + elif ':' in value: + digits = [int(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*int(value) + + inf_value = 1e300 + while inf_value != inf_value*inf_value: + inf_value *= inf_value + nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). + + def construct_yaml_float(self, node): + value = str(self.construct_scalar(node)) + value = value.replace('_', '').lower() + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '.inf': + return sign*self.inf_value + elif value == '.nan': + return self.nan_value + elif ':' in value: + digits = [float(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0.0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*float(value) + + def construct_yaml_binary(self, node): + value = self.construct_scalar(node) + try: + return str(value).decode('base64') + except (binascii.Error, UnicodeEncodeError), exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + timestamp_regexp = re.compile( + ur'''^(?P[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + delta = None + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + data = datetime.datetime(year, month, day, hour, minute, second, fraction) + if delta: + data -= delta + return data + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + value = self.construct_scalar(node) + try: + return value.encode('ascii') + except UnicodeEncodeError: + return value + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag.encode('utf-8'), + node.start_mark) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + u'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class Constructor(SafeConstructor): + + def construct_python_str(self, node): + return self.construct_scalar(node).encode('utf-8') + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_long(self, node): + return long(self.construct_yaml_int(node)) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + try: + __import__(name) + except ImportError, exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name.encode('utf-8'), exc), mark) + return sys.modules[name] + + def find_python_name(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if u'.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = '__builtin__' + object_name = name + try: + __import__(module_name) + except ImportError, exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name.encode('utf-8'), exc), mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" % (object_name.encode('utf-8'), + module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value.encode('utf-8'), + node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value.encode('utf-8'), + node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + class classobj: pass + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if newobj and isinstance(cls, type(self.classobj)) \ + and not args and not kwds: + instance = self.classobj() + instance.__class__ = cls + return instance + elif newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + setattr(object, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/none', + Constructor.construct_yaml_null) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/bool', + Constructor.construct_yaml_bool) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/str', + Constructor.construct_python_str) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/unicode', + Constructor.construct_python_unicode) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/int', + Constructor.construct_yaml_int) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/long', + Constructor.construct_python_long) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/float', + Constructor.construct_yaml_float) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/complex', + Constructor.construct_python_complex) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/list', + Constructor.construct_yaml_seq) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/tuple', + Constructor.construct_python_tuple) + +Constructor.add_constructor( + u'tag:yaml.org,2002:python/dict', + Constructor.construct_yaml_map) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/name:', + Constructor.construct_python_name) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/module:', + Constructor.construct_python_module) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object:', + Constructor.construct_python_object) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object/apply:', + Constructor.construct_python_object_apply) + +Constructor.add_multi_constructor( + u'tag:yaml.org,2002:python/object/new:', + Constructor.construct_python_object_new) + diff --git a/python/pyyaml/lib/yaml/cyaml.py b/python/pyyaml/lib/yaml/cyaml.py new file mode 100644 index 000000000000..68dcd7519288 --- /dev/null +++ b/python/pyyaml/lib/yaml/cyaml.py @@ -0,0 +1,85 @@ + +__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper'] + +from _yaml import CParser, CEmitter + +from constructor import * + +from serializer import * +from representer import * + +from resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib/yaml/dumper.py b/python/pyyaml/lib/yaml/dumper.py new file mode 100644 index 000000000000..f811d2c919bf --- /dev/null +++ b/python/pyyaml/lib/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from emitter import * +from serializer import * +from representer import * +from resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib/yaml/emitter.py b/python/pyyaml/lib/yaml/emitter.py new file mode 100644 index 000000000000..e5bcdcccbb1f --- /dev/null +++ b/python/pyyaml/lib/yaml/emitter.py @@ -0,0 +1,1140 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from error import YAMLError +from events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis(object): + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter(object): + + DEFAULT_TAG_PREFIXES = { + u'!' : u'!', + u'tag:yaml.org,2002:' : u'!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overriden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = u'\n' + if line_break in [u'\r', u'\n', u'\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not getattr(self.stream, 'encoding', None): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator(u'...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = self.event.tags.keys() + handles.sort() + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator(u'---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator(u'...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator(u'...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor(u'&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor(u'*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator(u'[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(u']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(u',', False) + self.write_indent() + self.write_indicator(u']', False) + self.state = self.states.pop() + else: + self.write_indicator(u',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator(u'{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(u'}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(u',', False) + self.write_indent() + self.write_indicator(u'}', False) + self.state = self.states.pop() + else: + self.write_indicator(u',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(u':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(u':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator(u'-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator(u'?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(u':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(u':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == u'') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = u'!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return u'%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != u'!' or handle[-1] != u'!': + raise EmitterError("tag handle must start and end with '!': %r" + % (handle.encode('utf-8'))) + for ch in handle[1:-1]: + if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch.encode('utf-8'), handle.encode('utf-8'))) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == u'!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append(u'%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return u''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == u'!': + return tag + handle = None + suffix = tag + prefixes = self.tag_prefixes.keys() + prefixes.sort() + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == u'!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?:@&=+$,_.~*\'()[]' \ + or (ch == u'!' and handle != u'!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append(u'%%%02X' % ord(ch)) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = u''.join(chunks) + if handle: + return u'%s%s' % (handle, suffix_text) + else: + return u'!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not (u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch.encode('utf-8'), anchor.encode('utf-8'))) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith(u'---') or scalar.startswith(u'...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceeded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in u'\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in u'#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in u'?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == u'-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in u',?[]{}': + flow_indicators = True + if ch == u':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == u'#' and preceeded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in u'\n\x85\u2028\u2029': + line_breaks = True + if not (ch == u'\n' or u'\x20' <= ch <= u'\x7E'): + if (ch == u'\x85' or u'\xA0' <= ch <= u'\uD7FF' + or u'\uE000' <= ch <= u'\uFFFD') and ch != u'\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == u' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in u'\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceeded_by_whitespace = (ch in u'\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in u'\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write(u'\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = u' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = u' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = u'%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = u'%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator(u'\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != u' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + if text[start] == u'\n': + self.write_line_break() + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029' or ch == u'\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == u'\'': + data = u'\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == u' ') + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + self.write_indicator(u'\'', False) + + ESCAPE_REPLACEMENTS = { + u'\0': u'0', + u'\x07': u'a', + u'\x08': u'b', + u'\x09': u't', + u'\x0A': u'n', + u'\x0B': u'v', + u'\x0C': u'f', + u'\x0D': u'r', + u'\x1B': u'e', + u'\"': u'\"', + u'\\': u'\\', + u'\x85': u'N', + u'\xA0': u'_', + u'\u2028': u'L', + u'\u2029': u'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator(u'"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in u'"\\\x85\u2028\u2029\uFEFF' \ + or not (u'\x20' <= ch <= u'\x7E' + or (self.allow_unicode + and (u'\xA0' <= ch <= u'\uD7FF' + or u'\uE000' <= ch <= u'\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = u'\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= u'\xFF': + data = u'\\x%02X' % ord(ch) + elif ch <= u'\uFFFF': + data = u'\\u%04X' % ord(ch) + else: + data = u'\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == u' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+u'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == u' ': + data = u'\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator(u'"', False) + + def determine_block_hints(self, text): + hints = u'' + if text: + if text[0] in u' \n\x85\u2028\u2029': + hints += unicode(self.best_indent) + if text[-1] not in u'\n\x85\u2028\u2029': + hints += u'-' + elif len(text) == 1 or text[-2] in u'\n\x85\u2028\u2029': + hints += u'+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator(u'>'+hints, True) + if hints[-1:] == u'+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != u' ' \ + and text[start] == u'\n': + self.write_line_break() + leading_space = (ch == u' ') + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != u' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in u'\n\x85\u2028\u2029') + spaces = (ch == u' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator(u'|'+hints, True) + if hints[-1:] == u'+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in u'\n\x85\u2028\u2029': + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in u'\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = u' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != u' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in u'\n\x85\u2028\u2029': + if text[start] == u'\n': + self.write_line_break() + for br in text[start:end]: + if br == u'\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in u' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == u' ') + breaks = (ch in u'\n\x85\u2028\u2029') + end += 1 + diff --git a/python/pyyaml/lib/yaml/error.py b/python/pyyaml/lib/yaml/error.py new file mode 100644 index 000000000000..577686db5fcd --- /dev/null +++ b/python/pyyaml/lib/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark(object): + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end].encode('utf-8') + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/python/pyyaml/lib/yaml/events.py b/python/pyyaml/lib/yaml/events.py new file mode 100644 index 000000000000..f79ad389cb6c --- /dev/null +++ b/python/pyyaml/lib/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/python/pyyaml/lib/yaml/loader.py b/python/pyyaml/lib/yaml/loader.py new file mode 100644 index 000000000000..293ff467b1c2 --- /dev/null +++ b/python/pyyaml/lib/yaml/loader.py @@ -0,0 +1,40 @@ + +__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] + +from reader import * +from scanner import * +from parser import * +from composer import * +from constructor import * +from resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib/yaml/nodes.py b/python/pyyaml/lib/yaml/nodes.py new file mode 100644 index 000000000000..c4f070c41e1f --- /dev/null +++ b/python/pyyaml/lib/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/python/pyyaml/lib/yaml/parser.py b/python/pyyaml/lib/yaml/parser.py new file mode 100644 index 000000000000..f9e3057f33d3 --- /dev/null +++ b/python/pyyaml/lib/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from error import MarkedYAMLError +from tokens import * +from events import * +from scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser(object): + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + u'!': u'!', + u'!!': u'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == u'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == u'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle.encode('utf-8'), + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle.encode('utf-8'), + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == u'!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == u'!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == u'!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), u'', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), u'', mark, mark) + diff --git a/python/pyyaml/lib/yaml/reader.py b/python/pyyaml/lib/yaml/reader.py new file mode 100644 index 000000000000..3249e6b9f51d --- /dev/null +++ b/python/pyyaml/lib/yaml/reader.py @@ -0,0 +1,190 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, str): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to unicode, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `str` object, + # - a `unicode` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = u'' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, unicode): + self.name = "" + self.check_printable(stream) + self.buffer = stream+u'\0' + elif isinstance(stream, str): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = '' + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in u'\n\x85\u2028\u2029' \ + or (ch == u'\r' and self.buffer[self.pointer] != u'\n'): + self.line += 1 + self.column = 0 + elif ch != u'\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and len(self.raw_buffer) < 2: + self.update_raw() + if not isinstance(self.raw_buffer, unicode): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile(u'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError, exc: + character = exc.object[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += u'\0' + self.raw_buffer = None + break + + def update_raw(self, size=1024): + data = self.stream.read(size) + if data: + self.raw_buffer += data + self.stream_pointer += len(data) + else: + self.eof = True + +#try: +# import psyco +# psyco.bind(Reader) +#except ImportError: +# pass + diff --git a/python/pyyaml/lib/yaml/representer.py b/python/pyyaml/lib/yaml/representer.py new file mode 100644 index 000000000000..5f4fc70dbc0b --- /dev/null +++ b/python/pyyaml/lib/yaml/representer.py @@ -0,0 +1,484 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from error import * +from nodes import * + +import datetime + +import sys, copy_reg, types + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter(object): + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=None): + self.default_style = default_style + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def get_classobj_bases(self, cls): + bases = [cls] + for base in cls.__bases__: + bases.extend(self.get_classobj_bases(base)) + return bases + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if type(data) is types.InstanceType: + data_types = self.get_classobj_bases(data.__class__)+list(data_types) + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, unicode(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + add_representer = classmethod(add_representer) + + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + add_multi_representer = classmethod(add_multi_representer) + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = mapping.items() + mapping.sort() + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data in [None, ()]: + return True + if isinstance(data, (str, unicode, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:null', + u'null') + + def represent_str(self, data): + tag = None + style = None + try: + data = unicode(data, 'ascii') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + try: + data = unicode(data, 'utf-8') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + data = data.encode('base64') + tag = u'tag:yaml.org,2002:binary' + style = '|' + return self.represent_scalar(tag, data, style=style) + + def represent_unicode(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:str', data) + + def represent_bool(self, data): + if data: + value = u'true' + else: + value = u'false' + return self.represent_scalar(u'tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) + + def represent_long(self, data): + return self.represent_scalar(u'tag:yaml.org,2002:int', unicode(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = u'.nan' + elif data == self.inf_value: + value = u'.inf' + elif data == -self.inf_value: + value = u'-.inf' + else: + value = unicode(repr(data)).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if u'.' not in value and u'e' in value: + value = value.replace(u'e', u'.0e', 1) + return self.represent_scalar(u'tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence(u'tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping(u'tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping(u'tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = unicode(data.isoformat()) + return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = unicode(data.isoformat(' ')) + return self.represent_scalar(u'tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object: %s" % data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(unicode, + SafeRepresenter.represent_unicode) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(long, + SafeRepresenter.represent_long) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_str(self, data): + tag = None + style = None + try: + data = unicode(data, 'ascii') + tag = u'tag:yaml.org,2002:str' + except UnicodeDecodeError: + try: + data = unicode(data, 'utf-8') + tag = u'tag:yaml.org,2002:python/str' + except UnicodeDecodeError: + data = data.encode('base64') + tag = u'tag:yaml.org,2002:binary' + style = '|' + return self.represent_scalar(tag, data, style=style) + + def represent_unicode(self, data): + tag = None + try: + data.encode('ascii') + tag = u'tag:yaml.org,2002:python/unicode' + except UnicodeEncodeError: + tag = u'tag:yaml.org,2002:str' + return self.represent_scalar(tag, data) + + def represent_long(self, data): + tag = u'tag:yaml.org,2002:int' + if int(data) is not data: + tag = u'tag:yaml.org,2002:python/long' + return self.represent_scalar(tag, unicode(data)) + + def represent_complex(self, data): + if data.imag == 0.0: + data = u'%r' % data.real + elif data.real == 0.0: + data = u'%rj' % data.imag + elif data.imag > 0: + data = u'%r+%rj' % (data.real, data.imag) + else: + data = u'%r%rj' % (data.real, data.imag) + return self.represent_scalar(u'tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence(u'tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = u'%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar(u'tag:yaml.org,2002:python/name:'+name, u'') + + def represent_module(self, data): + return self.represent_scalar( + u'tag:yaml.org,2002:python/module:'+data.__name__, u'') + + def represent_instance(self, data): + # For instances of classic classes, we use __getinitargs__ and + # __getstate__ to serialize the data. + + # If data.__getinitargs__ exists, the object must be reconstructed by + # calling cls(**args), where args is a tuple returned by + # __getinitargs__. Otherwise, the cls.__init__ method should never be + # called and the class instance is created by instantiating a trivial + # class and assigning to the instance's __class__ variable. + + # If data.__getstate__ exists, it returns the state of the object. + # Otherwise, the state of the object is data.__dict__. + + # We produce either a !!python/object or !!python/object/new node. + # If data.__getinitargs__ does not exist and state is a dictionary, we + # produce a !!python/object node . Otherwise we produce a + # !!python/object/new node. + + cls = data.__class__ + class_name = u'%s.%s' % (cls.__module__, cls.__name__) + args = None + state = None + if hasattr(data, '__getinitargs__'): + args = list(data.__getinitargs__()) + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__ + if args is None and isinstance(state, dict): + return self.represent_mapping( + u'tag:yaml.org,2002:python/object:'+class_name, state) + if isinstance(state, dict) and not state: + return self.represent_sequence( + u'tag:yaml.org,2002:python/object/new:'+class_name, args) + value = {} + if args: + value['args'] = args + value['state'] = state + return self.represent_mapping( + u'tag:yaml.org,2002:python/object/new:'+class_name, value) + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copy_reg.dispatch_table: + reduce = copy_reg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent object: %r" % data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = u'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = u'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = u'%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + u'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + +Representer.add_representer(str, + Representer.represent_str) + +Representer.add_representer(unicode, + Representer.represent_unicode) + +Representer.add_representer(long, + Representer.represent_long) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(types.ClassType, + Representer.represent_name) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(types.InstanceType, + Representer.represent_instance) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/python/pyyaml/lib/yaml/resolver.py b/python/pyyaml/lib/yaml/resolver.py new file mode 100644 index 000000000000..6b5ab87596ed --- /dev/null +++ b/python/pyyaml/lib/yaml/resolver.py @@ -0,0 +1,224 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from error import * +from nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver(object): + + DEFAULT_SCALAR_TAG = u'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = u'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy() + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + add_implicit_resolver = classmethod(add_implicit_resolver) + + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, basestring) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (basestring, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + add_path_resolver = classmethod(add_path_resolver) + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, basestring): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, basestring): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == u'': + resolvers = self.yaml_implicit_resolvers.get(u'', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:bool', + re.compile(ur'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list(u'yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:float', + re.compile(ur'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list(u'-+0123456789.')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:int', + re.compile(ur'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list(u'-+0123456789')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:merge', + re.compile(ur'^(?:<<)$'), + [u'<']) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:null', + re.compile(ur'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + [u'~', u'n', u'N', u'']) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:timestamp', + re.compile(ur'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list(u'0123456789')) + +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:value', + re.compile(ur'^(?:=)$'), + [u'=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + u'tag:yaml.org,2002:yaml', + re.compile(ur'^(?:!|&|\*)$'), + list(u'!&*')) + diff --git a/python/pyyaml/lib/yaml/scanner.py b/python/pyyaml/lib/yaml/scanner.py new file mode 100644 index 000000000000..5228fad65ce2 --- /dev/null +++ b/python/pyyaml/lib/yaml/scanner.py @@ -0,0 +1,1457 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from error import MarkedYAMLError +from tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey(object): + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner(object): + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == u'\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == u'%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == u'-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == u'.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == u'\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == u'[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == u'{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == u']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == u'}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == u',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == u'-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == u'?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == u':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == u'*': + return self.fetch_alias() + + # Is it an anchor? + if ch == u'&': + return self.fetch_anchor() + + # Is it a tag? + if ch == u'!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == u'|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == u'>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == u'\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == u'\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" + % ch.encode('utf-8'), self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in self.possible_simple_keys.keys(): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not found expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # A simple key is required only if it is the first token in the current + # line. Therefore it is always allowed. + assert self.allow_simple_key or not required + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not found expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid intendation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not nessesary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be catched by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == u'---' \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == u'...' \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in u'\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in u'\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in u'\0 \t\r\n\x85\u2028\u2029' + and (ch == u'-' or (not self.flow_level and ch in u'?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == u'\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == u'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == u'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" + % self.peek().encode('utf-8'), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" + % self.peek().encode('utf-8'), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not (u'0' <= ch <= u'9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch.encode('utf-8'), + self.get_mark()) + length = 0 + while u'0' <= self.peek(length) <= u'9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == u' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != u' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in u'\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch.encode('utf-8'), self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpteted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == u'*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in u'\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch.encode('utf-8'), self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == u'<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != u'>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek().encode('utf-8'), + self.get_mark()) + self.forward() + elif ch in u'\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = u'!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in u'\0 \r\n\x85\u2028\u2029': + if ch == u'!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = u'!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = u'!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch.encode('utf-8'), + self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = u'' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != u'\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in u' \t' + length = 0 + while self.peek(length) not in u'\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != u'\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == u'\n' \ + and leading_non_space and self.peek() not in u' \t': + if not breaks: + chunks.append(u' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == u'\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(u' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(u''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in u'+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in u'0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in u'0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in u'+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in u'\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch.encode('utf-8'), self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == u' ': + self.forward() + if self.peek() == u'#': + while self.peek() not in u'\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in u'\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" + % ch.encode('utf-8'), self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in u' \r\n\x85\u2028\u2029': + if self.peek() != u' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == u' ': + self.forward() + while self.peek() in u'\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == u' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(u''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + u'0': u'\0', + u'a': u'\x07', + u'b': u'\x08', + u't': u'\x09', + u'\t': u'\x09', + u'n': u'\x0A', + u'v': u'\x0B', + u'f': u'\x0C', + u'r': u'\x0D', + u'e': u'\x1B', + u' ': u'\x20', + u'\"': u'\"', + u'\\': u'\\', + u'N': u'\x85', + u'_': u'\xA0', + u'L': u'\u2028', + u'P': u'\u2029', + } + + ESCAPE_CODES = { + u'x': 2, + u'u': 4, + u'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in u'\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == u'\'' and self.peek(1) == u'\'': + chunks.append(u'\'') + self.forward(2) + elif (double and ch == u'\'') or (not double and ch in u'\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == u'\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in u'0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k).encode('utf-8')), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(unichr(code)) + self.forward(length) + elif ch in u'\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch.encode('utf-8'), self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in u' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == u'\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in u'\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != u'\n': + chunks.append(line_break) + elif not breaks: + chunks.append(u' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in u' \t': + self.forward() + if self.peek() in u'\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',', ':' and '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == u'#': + break + while True: + ch = self.peek(length) + if ch in u'\0 \t\r\n\x85\u2028\u2029' \ + or (not self.flow_level and ch == u':' and + self.peek(length+1) in u'\0 \t\r\n\x85\u2028\u2029') \ + or (self.flow_level and ch in u',:?[]{}'): + break + length += 1 + # It's not clear what we should do with ':' in the flow context. + if (self.flow_level and ch == u':' + and self.peek(length+1) not in u'\0 \t\r\n\x85\u2028\u2029,[]{}'): + self.forward(length) + raise ScannerError("while scanning a plain scalar", start_mark, + "found unexpected ':'", self.get_mark(), + "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == u'#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(u''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in u' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in u'\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in u' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == u'---' or prefix == u'...') \ + and self.peek(3) in u'\0 \t\r\n\x85\u2028\u2029': + return + if line_break != u'\n': + chunks.append(line_break) + elif not breaks: + chunks.append(u' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != u'!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch.encode('utf-8'), + self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != u' ': + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-_': + length += 1 + ch = self.peek(length) + if ch != u'!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch.encode('utf-8'), + self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while u'0' <= ch <= u'9' or u'A' <= ch <= u'Z' or u'a' <= ch <= u'z' \ + or ch in u'-;/?:@&=+$,_.!~*\'()[]%': + if ch == u'%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch.encode('utf-8'), + self.get_mark()) + return u''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + bytes = [] + mark = self.get_mark() + while self.peek() == u'%': + self.forward() + for k in range(2): + if self.peek(k) not in u'0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" % + (self.peek(k).encode('utf-8')), self.get_mark()) + bytes.append(chr(int(self.prefix(2), 16))) + self.forward(2) + try: + value = unicode(''.join(bytes), 'utf-8') + except UnicodeDecodeError, exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in u'\r\n\x85': + if self.prefix(2) == u'\r\n': + self.forward(2) + else: + self.forward() + return u'\n' + elif ch in u'\u2028\u2029': + self.forward() + return ch + return u'' + +#try: +# import psyco +# psyco.bind(Scanner) +#except ImportError: +# pass + diff --git a/python/pyyaml/lib/yaml/serializer.py b/python/pyyaml/lib/yaml/serializer.py new file mode 100644 index 000000000000..0bf1e96dc162 --- /dev/null +++ b/python/pyyaml/lib/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from error import YAMLError +from events import * +from nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer(object): + + ANCHOR_TEMPLATE = u'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/python/pyyaml/lib/yaml/tokens.py b/python/pyyaml/lib/yaml/tokens.py new file mode 100644 index 000000000000..4d0b48a394ac --- /dev/null +++ b/python/pyyaml/lib/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/python/pyyaml/lib3/yaml/__init__.py b/python/pyyaml/lib3/yaml/__init__.py new file mode 100644 index 000000000000..a5e20f94d253 --- /dev/null +++ b/python/pyyaml/lib3/yaml/__init__.py @@ -0,0 +1,312 @@ + +from .error import * + +from .tokens import * +from .events import * +from .nodes import * + +from .loader import * +from .dumper import * + +__version__ = '3.11' +try: + from .cyaml import * + __with_libyaml__ = True +except ImportError: + __with_libyaml__ = False + +import io + +def scan(stream, Loader=Loader): + """ + Scan a YAML stream and produce scanning tokens. + """ + loader = Loader(stream) + try: + while loader.check_token(): + yield loader.get_token() + finally: + loader.dispose() + +def parse(stream, Loader=Loader): + """ + Parse a YAML stream and produce parsing events. + """ + loader = Loader(stream) + try: + while loader.check_event(): + yield loader.get_event() + finally: + loader.dispose() + +def compose(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding representation tree. + """ + loader = Loader(stream) + try: + return loader.get_single_node() + finally: + loader.dispose() + +def compose_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding representation trees. + """ + loader = Loader(stream) + try: + while loader.check_node(): + yield loader.get_node() + finally: + loader.dispose() + +def load(stream, Loader=Loader): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + """ + loader = Loader(stream) + try: + return loader.get_single_data() + finally: + loader.dispose() + +def load_all(stream, Loader=Loader): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + """ + loader = Loader(stream) + try: + while loader.check_data(): + yield loader.get_data() + finally: + loader.dispose() + +def safe_load(stream): + """ + Parse the first YAML document in a stream + and produce the corresponding Python object. + Resolve only basic YAML tags. + """ + return load(stream, SafeLoader) + +def safe_load_all(stream): + """ + Parse all YAML documents in a stream + and produce corresponding Python objects. + Resolve only basic YAML tags. + """ + return load_all(stream, SafeLoader) + +def emit(events, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + """ + Emit YAML parsing events into a stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + stream = io.StringIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + try: + for event in events: + dumper.emit(event) + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize_all(nodes, stream=None, Dumper=Dumper, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of representation trees into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for node in nodes: + dumper.serialize(node) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def serialize(node, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a representation tree into a YAML stream. + If stream is None, return the produced string instead. + """ + return serialize_all([node], stream, Dumper=Dumper, **kwds) + +def dump_all(documents, stream=None, Dumper=Dumper, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + """ + Serialize a sequence of Python objects into a YAML stream. + If stream is None, return the produced string instead. + """ + getvalue = None + if stream is None: + if encoding is None: + stream = io.StringIO() + else: + stream = io.BytesIO() + getvalue = stream.getvalue + dumper = Dumper(stream, default_style=default_style, + default_flow_style=default_flow_style, + canonical=canonical, indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break, + encoding=encoding, version=version, tags=tags, + explicit_start=explicit_start, explicit_end=explicit_end) + try: + dumper.open() + for data in documents: + dumper.represent(data) + dumper.close() + finally: + dumper.dispose() + if getvalue: + return getvalue() + +def dump(data, stream=None, Dumper=Dumper, **kwds): + """ + Serialize a Python object into a YAML stream. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=Dumper, **kwds) + +def safe_dump_all(documents, stream=None, **kwds): + """ + Serialize a sequence of Python objects into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all(documents, stream, Dumper=SafeDumper, **kwds) + +def safe_dump(data, stream=None, **kwds): + """ + Serialize a Python object into a YAML stream. + Produce only basic YAML tags. + If stream is None, return the produced string instead. + """ + return dump_all([data], stream, Dumper=SafeDumper, **kwds) + +def add_implicit_resolver(tag, regexp, first=None, + Loader=Loader, Dumper=Dumper): + """ + Add an implicit scalar detector. + If an implicit scalar value matches the given regexp, + the corresponding tag is assigned to the scalar. + first is a sequence of possible initial characters or None. + """ + Loader.add_implicit_resolver(tag, regexp, first) + Dumper.add_implicit_resolver(tag, regexp, first) + +def add_path_resolver(tag, path, kind=None, Loader=Loader, Dumper=Dumper): + """ + Add a path based resolver for the given tag. + A path is a list of keys that forms a path + to a node in the representation tree. + Keys can be string values, integers, or None. + """ + Loader.add_path_resolver(tag, path, kind) + Dumper.add_path_resolver(tag, path, kind) + +def add_constructor(tag, constructor, Loader=Loader): + """ + Add a constructor for the given tag. + Constructor is a function that accepts a Loader instance + and a node object and produces the corresponding Python object. + """ + Loader.add_constructor(tag, constructor) + +def add_multi_constructor(tag_prefix, multi_constructor, Loader=Loader): + """ + Add a multi-constructor for the given tag prefix. + Multi-constructor is called for a node if its tag starts with tag_prefix. + Multi-constructor accepts a Loader instance, a tag suffix, + and a node object and produces the corresponding Python object. + """ + Loader.add_multi_constructor(tag_prefix, multi_constructor) + +def add_representer(data_type, representer, Dumper=Dumper): + """ + Add a representer for the given type. + Representer is a function accepting a Dumper instance + and an instance of the given data type + and producing the corresponding representation node. + """ + Dumper.add_representer(data_type, representer) + +def add_multi_representer(data_type, multi_representer, Dumper=Dumper): + """ + Add a representer for the given type. + Multi-representer is a function accepting a Dumper instance + and an instance of the given data type or subtype + and producing the corresponding representation node. + """ + Dumper.add_multi_representer(data_type, multi_representer) + +class YAMLObjectMetaclass(type): + """ + The metaclass for YAMLObject. + """ + def __init__(cls, name, bases, kwds): + super(YAMLObjectMetaclass, cls).__init__(name, bases, kwds) + if 'yaml_tag' in kwds and kwds['yaml_tag'] is not None: + cls.yaml_loader.add_constructor(cls.yaml_tag, cls.from_yaml) + cls.yaml_dumper.add_representer(cls, cls.to_yaml) + +class YAMLObject(metaclass=YAMLObjectMetaclass): + """ + An object that can dump itself to a YAML stream + and load itself from a YAML stream. + """ + + __slots__ = () # no direct instantiation, so allow immutable subclasses + + yaml_loader = Loader + yaml_dumper = Dumper + + yaml_tag = None + yaml_flow_style = None + + @classmethod + def from_yaml(cls, loader, node): + """ + Convert a representation node to a Python object. + """ + return loader.construct_yaml_object(node, cls) + + @classmethod + def to_yaml(cls, dumper, data): + """ + Convert a Python object to a representation node. + """ + return dumper.represent_yaml_object(cls.yaml_tag, data, cls, + flow_style=cls.yaml_flow_style) + diff --git a/python/pyyaml/lib3/yaml/composer.py b/python/pyyaml/lib3/yaml/composer.py new file mode 100644 index 000000000000..d5c6a7acd920 --- /dev/null +++ b/python/pyyaml/lib3/yaml/composer.py @@ -0,0 +1,139 @@ + +__all__ = ['Composer', 'ComposerError'] + +from .error import MarkedYAMLError +from .events import * +from .nodes import * + +class ComposerError(MarkedYAMLError): + pass + +class Composer: + + def __init__(self): + self.anchors = {} + + def check_node(self): + # Drop the STREAM-START event. + if self.check_event(StreamStartEvent): + self.get_event() + + # If there are more documents available? + return not self.check_event(StreamEndEvent) + + def get_node(self): + # Get the root node of the next document. + if not self.check_event(StreamEndEvent): + return self.compose_document() + + def get_single_node(self): + # Drop the STREAM-START event. + self.get_event() + + # Compose a document if the stream is not empty. + document = None + if not self.check_event(StreamEndEvent): + document = self.compose_document() + + # Ensure that the stream contains no more documents. + if not self.check_event(StreamEndEvent): + event = self.get_event() + raise ComposerError("expected a single document in the stream", + document.start_mark, "but found another document", + event.start_mark) + + # Drop the STREAM-END event. + self.get_event() + + return document + + def compose_document(self): + # Drop the DOCUMENT-START event. + self.get_event() + + # Compose the root node. + node = self.compose_node(None, None) + + # Drop the DOCUMENT-END event. + self.get_event() + + self.anchors = {} + return node + + def compose_node(self, parent, index): + if self.check_event(AliasEvent): + event = self.get_event() + anchor = event.anchor + if anchor not in self.anchors: + raise ComposerError(None, None, "found undefined alias %r" + % anchor, event.start_mark) + return self.anchors[anchor] + event = self.peek_event() + anchor = event.anchor + if anchor is not None: + if anchor in self.anchors: + raise ComposerError("found duplicate anchor %r; first occurence" + % anchor, self.anchors[anchor].start_mark, + "second occurence", event.start_mark) + self.descend_resolver(parent, index) + if self.check_event(ScalarEvent): + node = self.compose_scalar_node(anchor) + elif self.check_event(SequenceStartEvent): + node = self.compose_sequence_node(anchor) + elif self.check_event(MappingStartEvent): + node = self.compose_mapping_node(anchor) + self.ascend_resolver() + return node + + def compose_scalar_node(self, anchor): + event = self.get_event() + tag = event.tag + if tag is None or tag == '!': + tag = self.resolve(ScalarNode, event.value, event.implicit) + node = ScalarNode(tag, event.value, + event.start_mark, event.end_mark, style=event.style) + if anchor is not None: + self.anchors[anchor] = node + return node + + def compose_sequence_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(SequenceNode, None, start_event.implicit) + node = SequenceNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + index = 0 + while not self.check_event(SequenceEndEvent): + node.value.append(self.compose_node(node, index)) + index += 1 + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + + def compose_mapping_node(self, anchor): + start_event = self.get_event() + tag = start_event.tag + if tag is None or tag == '!': + tag = self.resolve(MappingNode, None, start_event.implicit) + node = MappingNode(tag, [], + start_event.start_mark, None, + flow_style=start_event.flow_style) + if anchor is not None: + self.anchors[anchor] = node + while not self.check_event(MappingEndEvent): + #key_event = self.peek_event() + item_key = self.compose_node(node, None) + #if item_key in node.value: + # raise ComposerError("while composing a mapping", start_event.start_mark, + # "found duplicate key", key_event.start_mark) + item_value = self.compose_node(node, item_key) + #node.value[item_key] = item_value + node.value.append((item_key, item_value)) + end_event = self.get_event() + node.end_mark = end_event.end_mark + return node + diff --git a/python/pyyaml/lib3/yaml/constructor.py b/python/pyyaml/lib3/yaml/constructor.py new file mode 100644 index 000000000000..981543aebb19 --- /dev/null +++ b/python/pyyaml/lib3/yaml/constructor.py @@ -0,0 +1,686 @@ + +__all__ = ['BaseConstructor', 'SafeConstructor', 'Constructor', + 'ConstructorError'] + +from .error import * +from .nodes import * + +import collections, datetime, base64, binascii, re, sys, types + +class ConstructorError(MarkedYAMLError): + pass + +class BaseConstructor: + + yaml_constructors = {} + yaml_multi_constructors = {} + + def __init__(self): + self.constructed_objects = {} + self.recursive_objects = {} + self.state_generators = [] + self.deep_construct = False + + def check_data(self): + # If there are more documents available? + return self.check_node() + + def get_data(self): + # Construct and return the next document. + if self.check_node(): + return self.construct_document(self.get_node()) + + def get_single_data(self): + # Ensure that the stream contains a single document and construct it. + node = self.get_single_node() + if node is not None: + return self.construct_document(node) + return None + + def construct_document(self, node): + data = self.construct_object(node) + while self.state_generators: + state_generators = self.state_generators + self.state_generators = [] + for generator in state_generators: + for dummy in generator: + pass + self.constructed_objects = {} + self.recursive_objects = {} + self.deep_construct = False + return data + + def construct_object(self, node, deep=False): + if node in self.constructed_objects: + return self.constructed_objects[node] + if deep: + old_deep = self.deep_construct + self.deep_construct = True + if node in self.recursive_objects: + raise ConstructorError(None, None, + "found unconstructable recursive node", node.start_mark) + self.recursive_objects[node] = None + constructor = None + tag_suffix = None + if node.tag in self.yaml_constructors: + constructor = self.yaml_constructors[node.tag] + else: + for tag_prefix in self.yaml_multi_constructors: + if node.tag.startswith(tag_prefix): + tag_suffix = node.tag[len(tag_prefix):] + constructor = self.yaml_multi_constructors[tag_prefix] + break + else: + if None in self.yaml_multi_constructors: + tag_suffix = node.tag + constructor = self.yaml_multi_constructors[None] + elif None in self.yaml_constructors: + constructor = self.yaml_constructors[None] + elif isinstance(node, ScalarNode): + constructor = self.__class__.construct_scalar + elif isinstance(node, SequenceNode): + constructor = self.__class__.construct_sequence + elif isinstance(node, MappingNode): + constructor = self.__class__.construct_mapping + if tag_suffix is None: + data = constructor(self, node) + else: + data = constructor(self, tag_suffix, node) + if isinstance(data, types.GeneratorType): + generator = data + data = next(generator) + if self.deep_construct: + for dummy in generator: + pass + else: + self.state_generators.append(generator) + self.constructed_objects[node] = data + del self.recursive_objects[node] + if deep: + self.deep_construct = old_deep + return data + + def construct_scalar(self, node): + if not isinstance(node, ScalarNode): + raise ConstructorError(None, None, + "expected a scalar node, but found %s" % node.id, + node.start_mark) + return node.value + + def construct_sequence(self, node, deep=False): + if not isinstance(node, SequenceNode): + raise ConstructorError(None, None, + "expected a sequence node, but found %s" % node.id, + node.start_mark) + return [self.construct_object(child, deep=deep) + for child in node.value] + + def construct_mapping(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + mapping = {} + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + if not isinstance(key, collections.Hashable): + raise ConstructorError("while constructing a mapping", node.start_mark, + "found unhashable key", key_node.start_mark) + value = self.construct_object(value_node, deep=deep) + mapping[key] = value + return mapping + + def construct_pairs(self, node, deep=False): + if not isinstance(node, MappingNode): + raise ConstructorError(None, None, + "expected a mapping node, but found %s" % node.id, + node.start_mark) + pairs = [] + for key_node, value_node in node.value: + key = self.construct_object(key_node, deep=deep) + value = self.construct_object(value_node, deep=deep) + pairs.append((key, value)) + return pairs + + @classmethod + def add_constructor(cls, tag, constructor): + if not 'yaml_constructors' in cls.__dict__: + cls.yaml_constructors = cls.yaml_constructors.copy() + cls.yaml_constructors[tag] = constructor + + @classmethod + def add_multi_constructor(cls, tag_prefix, multi_constructor): + if not 'yaml_multi_constructors' in cls.__dict__: + cls.yaml_multi_constructors = cls.yaml_multi_constructors.copy() + cls.yaml_multi_constructors[tag_prefix] = multi_constructor + +class SafeConstructor(BaseConstructor): + + def construct_scalar(self, node): + if isinstance(node, MappingNode): + for key_node, value_node in node.value: + if key_node.tag == 'tag:yaml.org,2002:value': + return self.construct_scalar(value_node) + return super().construct_scalar(node) + + def flatten_mapping(self, node): + merge = [] + index = 0 + while index < len(node.value): + key_node, value_node = node.value[index] + if key_node.tag == 'tag:yaml.org,2002:merge': + del node.value[index] + if isinstance(value_node, MappingNode): + self.flatten_mapping(value_node) + merge.extend(value_node.value) + elif isinstance(value_node, SequenceNode): + submerge = [] + for subnode in value_node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing a mapping", + node.start_mark, + "expected a mapping for merging, but found %s" + % subnode.id, subnode.start_mark) + self.flatten_mapping(subnode) + submerge.append(subnode.value) + submerge.reverse() + for value in submerge: + merge.extend(value) + else: + raise ConstructorError("while constructing a mapping", node.start_mark, + "expected a mapping or list of mappings for merging, but found %s" + % value_node.id, value_node.start_mark) + elif key_node.tag == 'tag:yaml.org,2002:value': + key_node.tag = 'tag:yaml.org,2002:str' + index += 1 + else: + index += 1 + if merge: + node.value = merge + node.value + + def construct_mapping(self, node, deep=False): + if isinstance(node, MappingNode): + self.flatten_mapping(node) + return super().construct_mapping(node, deep=deep) + + def construct_yaml_null(self, node): + self.construct_scalar(node) + return None + + bool_values = { + 'yes': True, + 'no': False, + 'true': True, + 'false': False, + 'on': True, + 'off': False, + } + + def construct_yaml_bool(self, node): + value = self.construct_scalar(node) + return self.bool_values[value.lower()] + + def construct_yaml_int(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '') + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '0': + return 0 + elif value.startswith('0b'): + return sign*int(value[2:], 2) + elif value.startswith('0x'): + return sign*int(value[2:], 16) + elif value[0] == '0': + return sign*int(value, 8) + elif ':' in value: + digits = [int(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*int(value) + + inf_value = 1e300 + while inf_value != inf_value*inf_value: + inf_value *= inf_value + nan_value = -inf_value/inf_value # Trying to make a quiet NaN (like C99). + + def construct_yaml_float(self, node): + value = self.construct_scalar(node) + value = value.replace('_', '').lower() + sign = +1 + if value[0] == '-': + sign = -1 + if value[0] in '+-': + value = value[1:] + if value == '.inf': + return sign*self.inf_value + elif value == '.nan': + return self.nan_value + elif ':' in value: + digits = [float(part) for part in value.split(':')] + digits.reverse() + base = 1 + value = 0.0 + for digit in digits: + value += digit*base + base *= 60 + return sign*value + else: + return sign*float(value) + + def construct_yaml_binary(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + timestamp_regexp = re.compile( + r'''^(?P[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)?$''', re.X) + + def construct_yaml_timestamp(self, node): + value = self.construct_scalar(node) + match = self.timestamp_regexp.match(node.value) + values = match.groupdict() + year = int(values['year']) + month = int(values['month']) + day = int(values['day']) + if not values['hour']: + return datetime.date(year, month, day) + hour = int(values['hour']) + minute = int(values['minute']) + second = int(values['second']) + fraction = 0 + if values['fraction']: + fraction = values['fraction'][:6] + while len(fraction) < 6: + fraction += '0' + fraction = int(fraction) + delta = None + if values['tz_sign']: + tz_hour = int(values['tz_hour']) + tz_minute = int(values['tz_minute'] or 0) + delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) + if values['tz_sign'] == '-': + delta = -delta + data = datetime.datetime(year, month, day, hour, minute, second, fraction) + if delta: + data -= delta + return data + + def construct_yaml_omap(self, node): + # Note: we do not check for duplicate keys, because it's too + # CPU-expensive. + omap = [] + yield omap + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing an ordered map", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + omap.append((key, value)) + + def construct_yaml_pairs(self, node): + # Note: the same code as `construct_yaml_omap`. + pairs = [] + yield pairs + if not isinstance(node, SequenceNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a sequence, but found %s" % node.id, node.start_mark) + for subnode in node.value: + if not isinstance(subnode, MappingNode): + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a mapping of length 1, but found %s" % subnode.id, + subnode.start_mark) + if len(subnode.value) != 1: + raise ConstructorError("while constructing pairs", node.start_mark, + "expected a single mapping item, but found %d items" % len(subnode.value), + subnode.start_mark) + key_node, value_node = subnode.value[0] + key = self.construct_object(key_node) + value = self.construct_object(value_node) + pairs.append((key, value)) + + def construct_yaml_set(self, node): + data = set() + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_str(self, node): + return self.construct_scalar(node) + + def construct_yaml_seq(self, node): + data = [] + yield data + data.extend(self.construct_sequence(node)) + + def construct_yaml_map(self, node): + data = {} + yield data + value = self.construct_mapping(node) + data.update(value) + + def construct_yaml_object(self, node, cls): + data = cls.__new__(cls) + yield data + if hasattr(data, '__setstate__'): + state = self.construct_mapping(node, deep=True) + data.__setstate__(state) + else: + state = self.construct_mapping(node) + data.__dict__.update(state) + + def construct_undefined(self, node): + raise ConstructorError(None, None, + "could not determine a constructor for the tag %r" % node.tag, + node.start_mark) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:null', + SafeConstructor.construct_yaml_null) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:bool', + SafeConstructor.construct_yaml_bool) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:int', + SafeConstructor.construct_yaml_int) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:float', + SafeConstructor.construct_yaml_float) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:binary', + SafeConstructor.construct_yaml_binary) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:timestamp', + SafeConstructor.construct_yaml_timestamp) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:omap', + SafeConstructor.construct_yaml_omap) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:pairs', + SafeConstructor.construct_yaml_pairs) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:set', + SafeConstructor.construct_yaml_set) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:str', + SafeConstructor.construct_yaml_str) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:seq', + SafeConstructor.construct_yaml_seq) + +SafeConstructor.add_constructor( + 'tag:yaml.org,2002:map', + SafeConstructor.construct_yaml_map) + +SafeConstructor.add_constructor(None, + SafeConstructor.construct_undefined) + +class Constructor(SafeConstructor): + + def construct_python_str(self, node): + return self.construct_scalar(node) + + def construct_python_unicode(self, node): + return self.construct_scalar(node) + + def construct_python_bytes(self, node): + try: + value = self.construct_scalar(node).encode('ascii') + except UnicodeEncodeError as exc: + raise ConstructorError(None, None, + "failed to convert base64 data into ascii: %s" % exc, + node.start_mark) + try: + if hasattr(base64, 'decodebytes'): + return base64.decodebytes(value) + else: + return base64.decodestring(value) + except binascii.Error as exc: + raise ConstructorError(None, None, + "failed to decode base64 data: %s" % exc, node.start_mark) + + def construct_python_long(self, node): + return self.construct_yaml_int(node) + + def construct_python_complex(self, node): + return complex(self.construct_scalar(node)) + + def construct_python_tuple(self, node): + return tuple(self.construct_sequence(node)) + + def find_python_module(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python module", mark, + "expected non-empty name appended to the tag", mark) + try: + __import__(name) + except ImportError as exc: + raise ConstructorError("while constructing a Python module", mark, + "cannot find module %r (%s)" % (name, exc), mark) + return sys.modules[name] + + def find_python_name(self, name, mark): + if not name: + raise ConstructorError("while constructing a Python object", mark, + "expected non-empty name appended to the tag", mark) + if '.' in name: + module_name, object_name = name.rsplit('.', 1) + else: + module_name = 'builtins' + object_name = name + try: + __import__(module_name) + except ImportError as exc: + raise ConstructorError("while constructing a Python object", mark, + "cannot find module %r (%s)" % (module_name, exc), mark) + module = sys.modules[module_name] + if not hasattr(module, object_name): + raise ConstructorError("while constructing a Python object", mark, + "cannot find %r in the module %r" + % (object_name, module.__name__), mark) + return getattr(module, object_name) + + def construct_python_name(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python name", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_name(suffix, node.start_mark) + + def construct_python_module(self, suffix, node): + value = self.construct_scalar(node) + if value: + raise ConstructorError("while constructing a Python module", node.start_mark, + "expected the empty value, but found %r" % value, node.start_mark) + return self.find_python_module(suffix, node.start_mark) + + def make_python_instance(self, suffix, node, + args=None, kwds=None, newobj=False): + if not args: + args = [] + if not kwds: + kwds = {} + cls = self.find_python_name(suffix, node.start_mark) + if newobj and isinstance(cls, type): + return cls.__new__(cls, *args, **kwds) + else: + return cls(*args, **kwds) + + def set_python_instance_state(self, instance, state): + if hasattr(instance, '__setstate__'): + instance.__setstate__(state) + else: + slotstate = {} + if isinstance(state, tuple) and len(state) == 2: + state, slotstate = state + if hasattr(instance, '__dict__'): + instance.__dict__.update(state) + elif state: + slotstate.update(state) + for key, value in slotstate.items(): + setattr(object, key, value) + + def construct_python_object(self, suffix, node): + # Format: + # !!python/object:module.name { ... state ... } + instance = self.make_python_instance(suffix, node, newobj=True) + yield instance + deep = hasattr(instance, '__setstate__') + state = self.construct_mapping(node, deep=deep) + self.set_python_instance_state(instance, state) + + def construct_python_object_apply(self, suffix, node, newobj=False): + # Format: + # !!python/object/apply # (or !!python/object/new) + # args: [ ... arguments ... ] + # kwds: { ... keywords ... } + # state: ... state ... + # listitems: [ ... listitems ... ] + # dictitems: { ... dictitems ... } + # or short format: + # !!python/object/apply [ ... arguments ... ] + # The difference between !!python/object/apply and !!python/object/new + # is how an object is created, check make_python_instance for details. + if isinstance(node, SequenceNode): + args = self.construct_sequence(node, deep=True) + kwds = {} + state = {} + listitems = [] + dictitems = {} + else: + value = self.construct_mapping(node, deep=True) + args = value.get('args', []) + kwds = value.get('kwds', {}) + state = value.get('state', {}) + listitems = value.get('listitems', []) + dictitems = value.get('dictitems', {}) + instance = self.make_python_instance(suffix, node, args, kwds, newobj) + if state: + self.set_python_instance_state(instance, state) + if listitems: + instance.extend(listitems) + if dictitems: + for key in dictitems: + instance[key] = dictitems[key] + return instance + + def construct_python_object_new(self, suffix, node): + return self.construct_python_object_apply(suffix, node, newobj=True) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/none', + Constructor.construct_yaml_null) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bool', + Constructor.construct_yaml_bool) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/str', + Constructor.construct_python_str) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/unicode', + Constructor.construct_python_unicode) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/bytes', + Constructor.construct_python_bytes) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/int', + Constructor.construct_yaml_int) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/long', + Constructor.construct_python_long) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/float', + Constructor.construct_yaml_float) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/complex', + Constructor.construct_python_complex) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/list', + Constructor.construct_yaml_seq) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/tuple', + Constructor.construct_python_tuple) + +Constructor.add_constructor( + 'tag:yaml.org,2002:python/dict', + Constructor.construct_yaml_map) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/name:', + Constructor.construct_python_name) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/module:', + Constructor.construct_python_module) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object:', + Constructor.construct_python_object) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/apply:', + Constructor.construct_python_object_apply) + +Constructor.add_multi_constructor( + 'tag:yaml.org,2002:python/object/new:', + Constructor.construct_python_object_new) + diff --git a/python/pyyaml/lib3/yaml/cyaml.py b/python/pyyaml/lib3/yaml/cyaml.py new file mode 100644 index 000000000000..d5cb87e994f5 --- /dev/null +++ b/python/pyyaml/lib3/yaml/cyaml.py @@ -0,0 +1,85 @@ + +__all__ = ['CBaseLoader', 'CSafeLoader', 'CLoader', + 'CBaseDumper', 'CSafeDumper', 'CDumper'] + +from _yaml import CParser, CEmitter + +from .constructor import * + +from .serializer import * +from .representer import * + +from .resolver import * + +class CBaseLoader(CParser, BaseConstructor, BaseResolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class CSafeLoader(CParser, SafeConstructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class CLoader(CParser, Constructor, Resolver): + + def __init__(self, stream): + CParser.__init__(self, stream) + Constructor.__init__(self) + Resolver.__init__(self) + +class CBaseDumper(CEmitter, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CSafeDumper(CEmitter, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class CDumper(CEmitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + CEmitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, encoding=encoding, + allow_unicode=allow_unicode, line_break=line_break, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib3/yaml/dumper.py b/python/pyyaml/lib3/yaml/dumper.py new file mode 100644 index 000000000000..0b691287712c --- /dev/null +++ b/python/pyyaml/lib3/yaml/dumper.py @@ -0,0 +1,62 @@ + +__all__ = ['BaseDumper', 'SafeDumper', 'Dumper'] + +from .emitter import * +from .serializer import * +from .representer import * +from .resolver import * + +class BaseDumper(Emitter, Serializer, BaseRepresenter, BaseResolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class SafeDumper(Emitter, Serializer, SafeRepresenter, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + SafeRepresenter.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + +class Dumper(Emitter, Serializer, Representer, Resolver): + + def __init__(self, stream, + default_style=None, default_flow_style=None, + canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None, + encoding=None, explicit_start=None, explicit_end=None, + version=None, tags=None): + Emitter.__init__(self, stream, canonical=canonical, + indent=indent, width=width, + allow_unicode=allow_unicode, line_break=line_break) + Serializer.__init__(self, encoding=encoding, + explicit_start=explicit_start, explicit_end=explicit_end, + version=version, tags=tags) + Representer.__init__(self, default_style=default_style, + default_flow_style=default_flow_style) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib3/yaml/emitter.py b/python/pyyaml/lib3/yaml/emitter.py new file mode 100644 index 000000000000..34cb145a5faa --- /dev/null +++ b/python/pyyaml/lib3/yaml/emitter.py @@ -0,0 +1,1137 @@ + +# Emitter expects events obeying the following grammar: +# stream ::= STREAM-START document* STREAM-END +# document ::= DOCUMENT-START node DOCUMENT-END +# node ::= SCALAR | sequence | mapping +# sequence ::= SEQUENCE-START node* SEQUENCE-END +# mapping ::= MAPPING-START (node node)* MAPPING-END + +__all__ = ['Emitter', 'EmitterError'] + +from .error import YAMLError +from .events import * + +class EmitterError(YAMLError): + pass + +class ScalarAnalysis: + def __init__(self, scalar, empty, multiline, + allow_flow_plain, allow_block_plain, + allow_single_quoted, allow_double_quoted, + allow_block): + self.scalar = scalar + self.empty = empty + self.multiline = multiline + self.allow_flow_plain = allow_flow_plain + self.allow_block_plain = allow_block_plain + self.allow_single_quoted = allow_single_quoted + self.allow_double_quoted = allow_double_quoted + self.allow_block = allow_block + +class Emitter: + + DEFAULT_TAG_PREFIXES = { + '!' : '!', + 'tag:yaml.org,2002:' : '!!', + } + + def __init__(self, stream, canonical=None, indent=None, width=None, + allow_unicode=None, line_break=None): + + # The stream should have the methods `write` and possibly `flush`. + self.stream = stream + + # Encoding can be overriden by STREAM-START. + self.encoding = None + + # Emitter is a state machine with a stack of states to handle nested + # structures. + self.states = [] + self.state = self.expect_stream_start + + # Current event and the event queue. + self.events = [] + self.event = None + + # The current indentation level and the stack of previous indents. + self.indents = [] + self.indent = None + + # Flow level. + self.flow_level = 0 + + # Contexts. + self.root_context = False + self.sequence_context = False + self.mapping_context = False + self.simple_key_context = False + + # Characteristics of the last emitted character: + # - current position. + # - is it a whitespace? + # - is it an indention character + # (indentation space, '-', '?', or ':')? + self.line = 0 + self.column = 0 + self.whitespace = True + self.indention = True + + # Whether the document requires an explicit document indicator + self.open_ended = False + + # Formatting details. + self.canonical = canonical + self.allow_unicode = allow_unicode + self.best_indent = 2 + if indent and 1 < indent < 10: + self.best_indent = indent + self.best_width = 80 + if width and width > self.best_indent*2: + self.best_width = width + self.best_line_break = '\n' + if line_break in ['\r', '\n', '\r\n']: + self.best_line_break = line_break + + # Tag prefixes. + self.tag_prefixes = None + + # Prepared anchor and tag. + self.prepared_anchor = None + self.prepared_tag = None + + # Scalar analysis and style. + self.analysis = None + self.style = None + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def emit(self, event): + self.events.append(event) + while not self.need_more_events(): + self.event = self.events.pop(0) + self.state() + self.event = None + + # In some cases, we wait for a few next events before emitting. + + def need_more_events(self): + if not self.events: + return True + event = self.events[0] + if isinstance(event, DocumentStartEvent): + return self.need_events(1) + elif isinstance(event, SequenceStartEvent): + return self.need_events(2) + elif isinstance(event, MappingStartEvent): + return self.need_events(3) + else: + return False + + def need_events(self, count): + level = 0 + for event in self.events[1:]: + if isinstance(event, (DocumentStartEvent, CollectionStartEvent)): + level += 1 + elif isinstance(event, (DocumentEndEvent, CollectionEndEvent)): + level -= 1 + elif isinstance(event, StreamEndEvent): + level = -1 + if level < 0: + return False + return (len(self.events) < count+1) + + def increase_indent(self, flow=False, indentless=False): + self.indents.append(self.indent) + if self.indent is None: + if flow: + self.indent = self.best_indent + else: + self.indent = 0 + elif not indentless: + self.indent += self.best_indent + + # States. + + # Stream handlers. + + def expect_stream_start(self): + if isinstance(self.event, StreamStartEvent): + if self.event.encoding and not hasattr(self.stream, 'encoding'): + self.encoding = self.event.encoding + self.write_stream_start() + self.state = self.expect_first_document_start + else: + raise EmitterError("expected StreamStartEvent, but got %s" + % self.event) + + def expect_nothing(self): + raise EmitterError("expected nothing, but got %s" % self.event) + + # Document handlers. + + def expect_first_document_start(self): + return self.expect_document_start(first=True) + + def expect_document_start(self, first=False): + if isinstance(self.event, DocumentStartEvent): + if (self.event.version or self.event.tags) and self.open_ended: + self.write_indicator('...', True) + self.write_indent() + if self.event.version: + version_text = self.prepare_version(self.event.version) + self.write_version_directive(version_text) + self.tag_prefixes = self.DEFAULT_TAG_PREFIXES.copy() + if self.event.tags: + handles = sorted(self.event.tags.keys()) + for handle in handles: + prefix = self.event.tags[handle] + self.tag_prefixes[prefix] = handle + handle_text = self.prepare_tag_handle(handle) + prefix_text = self.prepare_tag_prefix(prefix) + self.write_tag_directive(handle_text, prefix_text) + implicit = (first and not self.event.explicit and not self.canonical + and not self.event.version and not self.event.tags + and not self.check_empty_document()) + if not implicit: + self.write_indent() + self.write_indicator('---', True) + if self.canonical: + self.write_indent() + self.state = self.expect_document_root + elif isinstance(self.event, StreamEndEvent): + if self.open_ended: + self.write_indicator('...', True) + self.write_indent() + self.write_stream_end() + self.state = self.expect_nothing + else: + raise EmitterError("expected DocumentStartEvent, but got %s" + % self.event) + + def expect_document_end(self): + if isinstance(self.event, DocumentEndEvent): + self.write_indent() + if self.event.explicit: + self.write_indicator('...', True) + self.write_indent() + self.flush_stream() + self.state = self.expect_document_start + else: + raise EmitterError("expected DocumentEndEvent, but got %s" + % self.event) + + def expect_document_root(self): + self.states.append(self.expect_document_end) + self.expect_node(root=True) + + # Node handlers. + + def expect_node(self, root=False, sequence=False, mapping=False, + simple_key=False): + self.root_context = root + self.sequence_context = sequence + self.mapping_context = mapping + self.simple_key_context = simple_key + if isinstance(self.event, AliasEvent): + self.expect_alias() + elif isinstance(self.event, (ScalarEvent, CollectionStartEvent)): + self.process_anchor('&') + self.process_tag() + if isinstance(self.event, ScalarEvent): + self.expect_scalar() + elif isinstance(self.event, SequenceStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_sequence(): + self.expect_flow_sequence() + else: + self.expect_block_sequence() + elif isinstance(self.event, MappingStartEvent): + if self.flow_level or self.canonical or self.event.flow_style \ + or self.check_empty_mapping(): + self.expect_flow_mapping() + else: + self.expect_block_mapping() + else: + raise EmitterError("expected NodeEvent, but got %s" % self.event) + + def expect_alias(self): + if self.event.anchor is None: + raise EmitterError("anchor is not specified for alias") + self.process_anchor('*') + self.state = self.states.pop() + + def expect_scalar(self): + self.increase_indent(flow=True) + self.process_scalar() + self.indent = self.indents.pop() + self.state = self.states.pop() + + # Flow sequence handlers. + + def expect_flow_sequence(self): + self.write_indicator('[', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_sequence_item + + def expect_first_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator(']', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + def expect_flow_sequence_item(self): + if isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator(']', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + self.states.append(self.expect_flow_sequence_item) + self.expect_node(sequence=True) + + # Flow mapping handlers. + + def expect_flow_mapping(self): + self.write_indicator('{', True, whitespace=True) + self.flow_level += 1 + self.increase_indent(flow=True) + self.state = self.expect_first_flow_mapping_key + + def expect_first_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + self.write_indicator('}', False) + self.state = self.states.pop() + else: + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_key(self): + if isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.flow_level -= 1 + if self.canonical: + self.write_indicator(',', False) + self.write_indent() + self.write_indicator('}', False) + self.state = self.states.pop() + else: + self.write_indicator(',', False) + if self.canonical or self.column > self.best_width: + self.write_indent() + if not self.canonical and self.check_simple_key(): + self.states.append(self.expect_flow_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True) + self.states.append(self.expect_flow_mapping_value) + self.expect_node(mapping=True) + + def expect_flow_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + def expect_flow_mapping_value(self): + if self.canonical or self.column > self.best_width: + self.write_indent() + self.write_indicator(':', True) + self.states.append(self.expect_flow_mapping_key) + self.expect_node(mapping=True) + + # Block sequence handlers. + + def expect_block_sequence(self): + indentless = (self.mapping_context and not self.indention) + self.increase_indent(flow=False, indentless=indentless) + self.state = self.expect_first_block_sequence_item + + def expect_first_block_sequence_item(self): + return self.expect_block_sequence_item(first=True) + + def expect_block_sequence_item(self, first=False): + if not first and isinstance(self.event, SequenceEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + self.write_indicator('-', True, indention=True) + self.states.append(self.expect_block_sequence_item) + self.expect_node(sequence=True) + + # Block mapping handlers. + + def expect_block_mapping(self): + self.increase_indent(flow=False) + self.state = self.expect_first_block_mapping_key + + def expect_first_block_mapping_key(self): + return self.expect_block_mapping_key(first=True) + + def expect_block_mapping_key(self, first=False): + if not first and isinstance(self.event, MappingEndEvent): + self.indent = self.indents.pop() + self.state = self.states.pop() + else: + self.write_indent() + if self.check_simple_key(): + self.states.append(self.expect_block_mapping_simple_value) + self.expect_node(mapping=True, simple_key=True) + else: + self.write_indicator('?', True, indention=True) + self.states.append(self.expect_block_mapping_value) + self.expect_node(mapping=True) + + def expect_block_mapping_simple_value(self): + self.write_indicator(':', False) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + def expect_block_mapping_value(self): + self.write_indent() + self.write_indicator(':', True, indention=True) + self.states.append(self.expect_block_mapping_key) + self.expect_node(mapping=True) + + # Checkers. + + def check_empty_sequence(self): + return (isinstance(self.event, SequenceStartEvent) and self.events + and isinstance(self.events[0], SequenceEndEvent)) + + def check_empty_mapping(self): + return (isinstance(self.event, MappingStartEvent) and self.events + and isinstance(self.events[0], MappingEndEvent)) + + def check_empty_document(self): + if not isinstance(self.event, DocumentStartEvent) or not self.events: + return False + event = self.events[0] + return (isinstance(event, ScalarEvent) and event.anchor is None + and event.tag is None and event.implicit and event.value == '') + + def check_simple_key(self): + length = 0 + if isinstance(self.event, NodeEvent) and self.event.anchor is not None: + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + length += len(self.prepared_anchor) + if isinstance(self.event, (ScalarEvent, CollectionStartEvent)) \ + and self.event.tag is not None: + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(self.event.tag) + length += len(self.prepared_tag) + if isinstance(self.event, ScalarEvent): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + length += len(self.analysis.scalar) + return (length < 128 and (isinstance(self.event, AliasEvent) + or (isinstance(self.event, ScalarEvent) + and not self.analysis.empty and not self.analysis.multiline) + or self.check_empty_sequence() or self.check_empty_mapping())) + + # Anchor, Tag, and Scalar processors. + + def process_anchor(self, indicator): + if self.event.anchor is None: + self.prepared_anchor = None + return + if self.prepared_anchor is None: + self.prepared_anchor = self.prepare_anchor(self.event.anchor) + if self.prepared_anchor: + self.write_indicator(indicator+self.prepared_anchor, True) + self.prepared_anchor = None + + def process_tag(self): + tag = self.event.tag + if isinstance(self.event, ScalarEvent): + if self.style is None: + self.style = self.choose_scalar_style() + if ((not self.canonical or tag is None) and + ((self.style == '' and self.event.implicit[0]) + or (self.style != '' and self.event.implicit[1]))): + self.prepared_tag = None + return + if self.event.implicit[0] and tag is None: + tag = '!' + self.prepared_tag = None + else: + if (not self.canonical or tag is None) and self.event.implicit: + self.prepared_tag = None + return + if tag is None: + raise EmitterError("tag is not specified") + if self.prepared_tag is None: + self.prepared_tag = self.prepare_tag(tag) + if self.prepared_tag: + self.write_indicator(self.prepared_tag, True) + self.prepared_tag = None + + def choose_scalar_style(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.event.style == '"' or self.canonical: + return '"' + if not self.event.style and self.event.implicit[0]: + if (not (self.simple_key_context and + (self.analysis.empty or self.analysis.multiline)) + and (self.flow_level and self.analysis.allow_flow_plain + or (not self.flow_level and self.analysis.allow_block_plain))): + return '' + if self.event.style and self.event.style in '|>': + if (not self.flow_level and not self.simple_key_context + and self.analysis.allow_block): + return self.event.style + if not self.event.style or self.event.style == '\'': + if (self.analysis.allow_single_quoted and + not (self.simple_key_context and self.analysis.multiline)): + return '\'' + return '"' + + def process_scalar(self): + if self.analysis is None: + self.analysis = self.analyze_scalar(self.event.value) + if self.style is None: + self.style = self.choose_scalar_style() + split = (not self.simple_key_context) + #if self.analysis.multiline and split \ + # and (not self.style or self.style in '\'\"'): + # self.write_indent() + if self.style == '"': + self.write_double_quoted(self.analysis.scalar, split) + elif self.style == '\'': + self.write_single_quoted(self.analysis.scalar, split) + elif self.style == '>': + self.write_folded(self.analysis.scalar) + elif self.style == '|': + self.write_literal(self.analysis.scalar) + else: + self.write_plain(self.analysis.scalar, split) + self.analysis = None + self.style = None + + # Analyzers. + + def prepare_version(self, version): + major, minor = version + if major != 1: + raise EmitterError("unsupported YAML version: %d.%d" % (major, minor)) + return '%d.%d' % (major, minor) + + def prepare_tag_handle(self, handle): + if not handle: + raise EmitterError("tag handle must not be empty") + if handle[0] != '!' or handle[-1] != '!': + raise EmitterError("tag handle must start and end with '!': %r" % handle) + for ch in handle[1:-1]: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the tag handle: %r" + % (ch, handle)) + return handle + + def prepare_tag_prefix(self, prefix): + if not prefix: + raise EmitterError("tag prefix must not be empty") + chunks = [] + start = end = 0 + if prefix[0] == '!': + end = 1 + while end < len(prefix): + ch = prefix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?!:@&=+$,_.~*\'()[]': + end += 1 + else: + if start < end: + chunks.append(prefix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(prefix[start:end]) + return ''.join(chunks) + + def prepare_tag(self, tag): + if not tag: + raise EmitterError("tag must not be empty") + if tag == '!': + return tag + handle = None + suffix = tag + prefixes = sorted(self.tag_prefixes.keys()) + for prefix in prefixes: + if tag.startswith(prefix) \ + and (prefix == '!' or len(prefix) < len(tag)): + handle = self.tag_prefixes[prefix] + suffix = tag[len(prefix):] + chunks = [] + start = end = 0 + while end < len(suffix): + ch = suffix[end] + if '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.~*\'()[]' \ + or (ch == '!' and handle != '!'): + end += 1 + else: + if start < end: + chunks.append(suffix[start:end]) + start = end = end+1 + data = ch.encode('utf-8') + for ch in data: + chunks.append('%%%02X' % ord(ch)) + if start < end: + chunks.append(suffix[start:end]) + suffix_text = ''.join(chunks) + if handle: + return '%s%s' % (handle, suffix_text) + else: + return '!<%s>' % suffix_text + + def prepare_anchor(self, anchor): + if not anchor: + raise EmitterError("anchor must not be empty") + for ch in anchor: + if not ('0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_'): + raise EmitterError("invalid character %r in the anchor: %r" + % (ch, anchor)) + return anchor + + def analyze_scalar(self, scalar): + + # Empty scalar is a special case. + if not scalar: + return ScalarAnalysis(scalar=scalar, empty=True, multiline=False, + allow_flow_plain=False, allow_block_plain=True, + allow_single_quoted=True, allow_double_quoted=True, + allow_block=False) + + # Indicators and special characters. + block_indicators = False + flow_indicators = False + line_breaks = False + special_characters = False + + # Important whitespace combinations. + leading_space = False + leading_break = False + trailing_space = False + trailing_break = False + break_space = False + space_break = False + + # Check document indicators. + if scalar.startswith('---') or scalar.startswith('...'): + block_indicators = True + flow_indicators = True + + # First character or preceded by a whitespace. + preceeded_by_whitespace = True + + # Last character or followed by a whitespace. + followed_by_whitespace = (len(scalar) == 1 or + scalar[1] in '\0 \t\r\n\x85\u2028\u2029') + + # The previous character is a space. + previous_space = False + + # The previous character is a break. + previous_break = False + + index = 0 + while index < len(scalar): + ch = scalar[index] + + # Check for indicators. + if index == 0: + # Leading indicators are special characters. + if ch in '#,[]{}&*!|>\'\"%@`': + flow_indicators = True + block_indicators = True + if ch in '?:': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '-' and followed_by_whitespace: + flow_indicators = True + block_indicators = True + else: + # Some indicators cannot appear within a scalar as well. + if ch in ',?[]{}': + flow_indicators = True + if ch == ':': + flow_indicators = True + if followed_by_whitespace: + block_indicators = True + if ch == '#' and preceeded_by_whitespace: + flow_indicators = True + block_indicators = True + + # Check for line breaks, special, and unicode characters. + if ch in '\n\x85\u2028\u2029': + line_breaks = True + if not (ch == '\n' or '\x20' <= ch <= '\x7E'): + if (ch == '\x85' or '\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD') and ch != '\uFEFF': + unicode_characters = True + if not self.allow_unicode: + special_characters = True + else: + special_characters = True + + # Detect important whitespace combinations. + if ch == ' ': + if index == 0: + leading_space = True + if index == len(scalar)-1: + trailing_space = True + if previous_break: + break_space = True + previous_space = True + previous_break = False + elif ch in '\n\x85\u2028\u2029': + if index == 0: + leading_break = True + if index == len(scalar)-1: + trailing_break = True + if previous_space: + space_break = True + previous_space = False + previous_break = True + else: + previous_space = False + previous_break = False + + # Prepare for the next character. + index += 1 + preceeded_by_whitespace = (ch in '\0 \t\r\n\x85\u2028\u2029') + followed_by_whitespace = (index+1 >= len(scalar) or + scalar[index+1] in '\0 \t\r\n\x85\u2028\u2029') + + # Let's decide what styles are allowed. + allow_flow_plain = True + allow_block_plain = True + allow_single_quoted = True + allow_double_quoted = True + allow_block = True + + # Leading and trailing whitespaces are bad for plain scalars. + if (leading_space or leading_break + or trailing_space or trailing_break): + allow_flow_plain = allow_block_plain = False + + # We do not permit trailing spaces for block scalars. + if trailing_space: + allow_block = False + + # Spaces at the beginning of a new line are only acceptable for block + # scalars. + if break_space: + allow_flow_plain = allow_block_plain = allow_single_quoted = False + + # Spaces followed by breaks, as well as special character are only + # allowed for double quoted scalars. + if space_break or special_characters: + allow_flow_plain = allow_block_plain = \ + allow_single_quoted = allow_block = False + + # Although the plain scalar writer supports breaks, we never emit + # multiline plain scalars. + if line_breaks: + allow_flow_plain = allow_block_plain = False + + # Flow indicators are forbidden for flow plain scalars. + if flow_indicators: + allow_flow_plain = False + + # Block indicators are forbidden for block plain scalars. + if block_indicators: + allow_block_plain = False + + return ScalarAnalysis(scalar=scalar, + empty=False, multiline=line_breaks, + allow_flow_plain=allow_flow_plain, + allow_block_plain=allow_block_plain, + allow_single_quoted=allow_single_quoted, + allow_double_quoted=allow_double_quoted, + allow_block=allow_block) + + # Writers. + + def flush_stream(self): + if hasattr(self.stream, 'flush'): + self.stream.flush() + + def write_stream_start(self): + # Write BOM if needed. + if self.encoding and self.encoding.startswith('utf-16'): + self.stream.write('\uFEFF'.encode(self.encoding)) + + def write_stream_end(self): + self.flush_stream() + + def write_indicator(self, indicator, need_whitespace, + whitespace=False, indention=False): + if self.whitespace or not need_whitespace: + data = indicator + else: + data = ' '+indicator + self.whitespace = whitespace + self.indention = self.indention and indention + self.column += len(data) + self.open_ended = False + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_indent(self): + indent = self.indent or 0 + if not self.indention or self.column > indent \ + or (self.column == indent and not self.whitespace): + self.write_line_break() + if self.column < indent: + self.whitespace = True + data = ' '*(indent-self.column) + self.column = indent + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_line_break(self, data=None): + if data is None: + data = self.best_line_break + self.whitespace = True + self.indention = True + self.line += 1 + self.column = 0 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + + def write_version_directive(self, version_text): + data = '%%YAML %s' % version_text + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + def write_tag_directive(self, handle_text, prefix_text): + data = '%%TAG %s %s' % (handle_text, prefix_text) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_line_break() + + # Scalar streams. + + def write_single_quoted(self, text, split=True): + self.write_indicator('\'', True) + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch is None or ch != ' ': + if start+1 == end and self.column > self.best_width and split \ + and start != 0 and end != len(text): + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029' or ch == '\'': + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch == '\'': + data = '\'\'' + self.column += 2 + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + 1 + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + self.write_indicator('\'', False) + + ESCAPE_REPLACEMENTS = { + '\0': '0', + '\x07': 'a', + '\x08': 'b', + '\x09': 't', + '\x0A': 'n', + '\x0B': 'v', + '\x0C': 'f', + '\x0D': 'r', + '\x1B': 'e', + '\"': '\"', + '\\': '\\', + '\x85': 'N', + '\xA0': '_', + '\u2028': 'L', + '\u2029': 'P', + } + + def write_double_quoted(self, text, split=True): + self.write_indicator('"', True) + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if ch is None or ch in '"\\\x85\u2028\u2029\uFEFF' \ + or not ('\x20' <= ch <= '\x7E' + or (self.allow_unicode + and ('\xA0' <= ch <= '\uD7FF' + or '\uE000' <= ch <= '\uFFFD'))): + if start < end: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + if ch in self.ESCAPE_REPLACEMENTS: + data = '\\'+self.ESCAPE_REPLACEMENTS[ch] + elif ch <= '\xFF': + data = '\\x%02X' % ord(ch) + elif ch <= '\uFFFF': + data = '\\u%04X' % ord(ch) + else: + data = '\\U%08X' % ord(ch) + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end+1 + if 0 < end < len(text)-1 and (ch == ' ' or start >= end) \ + and self.column+(end-start) > self.best_width and split: + data = text[start:end]+'\\' + if start < end: + start = end + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.write_indent() + self.whitespace = False + self.indention = False + if text[start] == ' ': + data = '\\' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + end += 1 + self.write_indicator('"', False) + + def determine_block_hints(self, text): + hints = '' + if text: + if text[0] in ' \n\x85\u2028\u2029': + hints += str(self.best_indent) + if text[-1] not in '\n\x85\u2028\u2029': + hints += '-' + elif len(text) == 1 or text[-2] in '\n\x85\u2028\u2029': + hints += '+' + return hints + + def write_folded(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('>'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + leading_space = True + spaces = False + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + if not leading_space and ch is not None and ch != ' ' \ + and text[start] == '\n': + self.write_line_break() + leading_space = (ch == ' ') + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + elif spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width: + self.write_indent() + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + spaces = (ch == ' ') + end += 1 + + def write_literal(self, text): + hints = self.determine_block_hints(text) + self.write_indicator('|'+hints, True) + if hints[-1:] == '+': + self.open_ended = True + self.write_line_break() + breaks = True + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if breaks: + if ch is None or ch not in '\n\x85\u2028\u2029': + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + if ch is not None: + self.write_indent() + start = end + else: + if ch is None or ch in '\n\x85\u2028\u2029': + data = text[start:end] + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + if ch is None: + self.write_line_break() + start = end + if ch is not None: + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + + def write_plain(self, text, split=True): + if self.root_context: + self.open_ended = True + if not text: + return + if not self.whitespace: + data = ' ' + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + self.whitespace = False + self.indention = False + spaces = False + breaks = False + start = end = 0 + while end <= len(text): + ch = None + if end < len(text): + ch = text[end] + if spaces: + if ch != ' ': + if start+1 == end and self.column > self.best_width and split: + self.write_indent() + self.whitespace = False + self.indention = False + else: + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + elif breaks: + if ch not in '\n\x85\u2028\u2029': + if text[start] == '\n': + self.write_line_break() + for br in text[start:end]: + if br == '\n': + self.write_line_break() + else: + self.write_line_break(br) + self.write_indent() + self.whitespace = False + self.indention = False + start = end + else: + if ch is None or ch in ' \n\x85\u2028\u2029': + data = text[start:end] + self.column += len(data) + if self.encoding: + data = data.encode(self.encoding) + self.stream.write(data) + start = end + if ch is not None: + spaces = (ch == ' ') + breaks = (ch in '\n\x85\u2028\u2029') + end += 1 + diff --git a/python/pyyaml/lib3/yaml/error.py b/python/pyyaml/lib3/yaml/error.py new file mode 100644 index 000000000000..b796b4dc5195 --- /dev/null +++ b/python/pyyaml/lib3/yaml/error.py @@ -0,0 +1,75 @@ + +__all__ = ['Mark', 'YAMLError', 'MarkedYAMLError'] + +class Mark: + + def __init__(self, name, index, line, column, buffer, pointer): + self.name = name + self.index = index + self.line = line + self.column = column + self.buffer = buffer + self.pointer = pointer + + def get_snippet(self, indent=4, max_length=75): + if self.buffer is None: + return None + head = '' + start = self.pointer + while start > 0 and self.buffer[start-1] not in '\0\r\n\x85\u2028\u2029': + start -= 1 + if self.pointer-start > max_length/2-1: + head = ' ... ' + start += 5 + break + tail = '' + end = self.pointer + while end < len(self.buffer) and self.buffer[end] not in '\0\r\n\x85\u2028\u2029': + end += 1 + if end-self.pointer > max_length/2-1: + tail = ' ... ' + end -= 5 + break + snippet = self.buffer[start:end] + return ' '*indent + head + snippet + tail + '\n' \ + + ' '*(indent+self.pointer-start+len(head)) + '^' + + def __str__(self): + snippet = self.get_snippet() + where = " in \"%s\", line %d, column %d" \ + % (self.name, self.line+1, self.column+1) + if snippet is not None: + where += ":\n"+snippet + return where + +class YAMLError(Exception): + pass + +class MarkedYAMLError(YAMLError): + + def __init__(self, context=None, context_mark=None, + problem=None, problem_mark=None, note=None): + self.context = context + self.context_mark = context_mark + self.problem = problem + self.problem_mark = problem_mark + self.note = note + + def __str__(self): + lines = [] + if self.context is not None: + lines.append(self.context) + if self.context_mark is not None \ + and (self.problem is None or self.problem_mark is None + or self.context_mark.name != self.problem_mark.name + or self.context_mark.line != self.problem_mark.line + or self.context_mark.column != self.problem_mark.column): + lines.append(str(self.context_mark)) + if self.problem is not None: + lines.append(self.problem) + if self.problem_mark is not None: + lines.append(str(self.problem_mark)) + if self.note is not None: + lines.append(self.note) + return '\n'.join(lines) + diff --git a/python/pyyaml/lib3/yaml/events.py b/python/pyyaml/lib3/yaml/events.py new file mode 100644 index 000000000000..f79ad389cb6c --- /dev/null +++ b/python/pyyaml/lib3/yaml/events.py @@ -0,0 +1,86 @@ + +# Abstract classes. + +class Event(object): + def __init__(self, start_mark=None, end_mark=None): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in ['anchor', 'tag', 'implicit', 'value'] + if hasattr(self, key)] + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +class NodeEvent(Event): + def __init__(self, anchor, start_mark=None, end_mark=None): + self.anchor = anchor + self.start_mark = start_mark + self.end_mark = end_mark + +class CollectionStartEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, start_mark=None, end_mark=None, + flow_style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class CollectionEndEvent(Event): + pass + +# Implementations. + +class StreamStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndEvent(Event): + pass + +class DocumentStartEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None, version=None, tags=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + self.version = version + self.tags = tags + +class DocumentEndEvent(Event): + def __init__(self, start_mark=None, end_mark=None, + explicit=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.explicit = explicit + +class AliasEvent(NodeEvent): + pass + +class ScalarEvent(NodeEvent): + def __init__(self, anchor, tag, implicit, value, + start_mark=None, end_mark=None, style=None): + self.anchor = anchor + self.tag = tag + self.implicit = implicit + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class SequenceStartEvent(CollectionStartEvent): + pass + +class SequenceEndEvent(CollectionEndEvent): + pass + +class MappingStartEvent(CollectionStartEvent): + pass + +class MappingEndEvent(CollectionEndEvent): + pass + diff --git a/python/pyyaml/lib3/yaml/loader.py b/python/pyyaml/lib3/yaml/loader.py new file mode 100644 index 000000000000..08c8f01b3460 --- /dev/null +++ b/python/pyyaml/lib3/yaml/loader.py @@ -0,0 +1,40 @@ + +__all__ = ['BaseLoader', 'SafeLoader', 'Loader'] + +from .reader import * +from .scanner import * +from .parser import * +from .composer import * +from .constructor import * +from .resolver import * + +class BaseLoader(Reader, Scanner, Parser, Composer, BaseConstructor, BaseResolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + BaseConstructor.__init__(self) + BaseResolver.__init__(self) + +class SafeLoader(Reader, Scanner, Parser, Composer, SafeConstructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + SafeConstructor.__init__(self) + Resolver.__init__(self) + +class Loader(Reader, Scanner, Parser, Composer, Constructor, Resolver): + + def __init__(self, stream): + Reader.__init__(self, stream) + Scanner.__init__(self) + Parser.__init__(self) + Composer.__init__(self) + Constructor.__init__(self) + Resolver.__init__(self) + diff --git a/python/pyyaml/lib3/yaml/nodes.py b/python/pyyaml/lib3/yaml/nodes.py new file mode 100644 index 000000000000..c4f070c41e1f --- /dev/null +++ b/python/pyyaml/lib3/yaml/nodes.py @@ -0,0 +1,49 @@ + +class Node(object): + def __init__(self, tag, value, start_mark, end_mark): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + value = self.value + #if isinstance(value, list): + # if len(value) == 0: + # value = '' + # elif len(value) == 1: + # value = '<1 item>' + # else: + # value = '<%d items>' % len(value) + #else: + # if len(value) > 75: + # value = repr(value[:70]+u' ... ') + # else: + # value = repr(value) + value = repr(value) + return '%s(tag=%r, value=%s)' % (self.__class__.__name__, self.tag, value) + +class ScalarNode(Node): + id = 'scalar' + def __init__(self, tag, value, + start_mark=None, end_mark=None, style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + +class CollectionNode(Node): + def __init__(self, tag, value, + start_mark=None, end_mark=None, flow_style=None): + self.tag = tag + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + self.flow_style = flow_style + +class SequenceNode(CollectionNode): + id = 'sequence' + +class MappingNode(CollectionNode): + id = 'mapping' + diff --git a/python/pyyaml/lib3/yaml/parser.py b/python/pyyaml/lib3/yaml/parser.py new file mode 100644 index 000000000000..13a5995d2920 --- /dev/null +++ b/python/pyyaml/lib3/yaml/parser.py @@ -0,0 +1,589 @@ + +# The following YAML grammar is LL(1) and is parsed by a recursive descent +# parser. +# +# stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +# implicit_document ::= block_node DOCUMENT-END* +# explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +# block_node_or_indentless_sequence ::= +# ALIAS +# | properties (block_content | indentless_block_sequence)? +# | block_content +# | indentless_block_sequence +# block_node ::= ALIAS +# | properties block_content? +# | block_content +# flow_node ::= ALIAS +# | properties flow_content? +# | flow_content +# properties ::= TAG ANCHOR? | ANCHOR TAG? +# block_content ::= block_collection | flow_collection | SCALAR +# flow_content ::= flow_collection | SCALAR +# block_collection ::= block_sequence | block_mapping +# flow_collection ::= flow_sequence | flow_mapping +# block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +# indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +# block_mapping ::= BLOCK-MAPPING_START +# ((KEY block_node_or_indentless_sequence?)? +# (VALUE block_node_or_indentless_sequence?)?)* +# BLOCK-END +# flow_sequence ::= FLOW-SEQUENCE-START +# (flow_sequence_entry FLOW-ENTRY)* +# flow_sequence_entry? +# FLOW-SEQUENCE-END +# flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# flow_mapping ::= FLOW-MAPPING-START +# (flow_mapping_entry FLOW-ENTRY)* +# flow_mapping_entry? +# FLOW-MAPPING-END +# flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +# +# FIRST sets: +# +# stream: { STREAM-START } +# explicit_document: { DIRECTIVE DOCUMENT-START } +# implicit_document: FIRST(block_node) +# block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR } +# block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# block_sequence: { BLOCK-SEQUENCE-START } +# block_mapping: { BLOCK-MAPPING-START } +# block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY } +# indentless_sequence: { ENTRY } +# flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START } +# flow_sequence: { FLOW-SEQUENCE-START } +# flow_mapping: { FLOW-MAPPING-START } +# flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } +# flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY } + +__all__ = ['Parser', 'ParserError'] + +from .error import MarkedYAMLError +from .tokens import * +from .events import * +from .scanner import * + +class ParserError(MarkedYAMLError): + pass + +class Parser: + # Since writing a recursive-descendant parser is a straightforward task, we + # do not give many comments here. + + DEFAULT_TAGS = { + '!': '!', + '!!': 'tag:yaml.org,2002:', + } + + def __init__(self): + self.current_event = None + self.yaml_version = None + self.tag_handles = {} + self.states = [] + self.marks = [] + self.state = self.parse_stream_start + + def dispose(self): + # Reset the state attributes (to clear self-references) + self.states = [] + self.state = None + + def check_event(self, *choices): + # Check the type of the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + if self.current_event is not None: + if not choices: + return True + for choice in choices: + if isinstance(self.current_event, choice): + return True + return False + + def peek_event(self): + # Get the next event. + if self.current_event is None: + if self.state: + self.current_event = self.state() + return self.current_event + + def get_event(self): + # Get the next event and proceed further. + if self.current_event is None: + if self.state: + self.current_event = self.state() + value = self.current_event + self.current_event = None + return value + + # stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + # implicit_document ::= block_node DOCUMENT-END* + # explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + + def parse_stream_start(self): + + # Parse the stream start. + token = self.get_token() + event = StreamStartEvent(token.start_mark, token.end_mark, + encoding=token.encoding) + + # Prepare the next state. + self.state = self.parse_implicit_document_start + + return event + + def parse_implicit_document_start(self): + + # Parse an implicit document. + if not self.check_token(DirectiveToken, DocumentStartToken, + StreamEndToken): + self.tag_handles = self.DEFAULT_TAGS + token = self.peek_token() + start_mark = end_mark = token.start_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=False) + + # Prepare the next state. + self.states.append(self.parse_document_end) + self.state = self.parse_block_node + + return event + + else: + return self.parse_document_start() + + def parse_document_start(self): + + # Parse any extra document end indicators. + while self.check_token(DocumentEndToken): + self.get_token() + + # Parse an explicit document. + if not self.check_token(StreamEndToken): + token = self.peek_token() + start_mark = token.start_mark + version, tags = self.process_directives() + if not self.check_token(DocumentStartToken): + raise ParserError(None, None, + "expected '', but found %r" + % self.peek_token().id, + self.peek_token().start_mark) + token = self.get_token() + end_mark = token.end_mark + event = DocumentStartEvent(start_mark, end_mark, + explicit=True, version=version, tags=tags) + self.states.append(self.parse_document_end) + self.state = self.parse_document_content + else: + # Parse the end of the stream. + token = self.get_token() + event = StreamEndEvent(token.start_mark, token.end_mark) + assert not self.states + assert not self.marks + self.state = None + return event + + def parse_document_end(self): + + # Parse the document end. + token = self.peek_token() + start_mark = end_mark = token.start_mark + explicit = False + if self.check_token(DocumentEndToken): + token = self.get_token() + end_mark = token.end_mark + explicit = True + event = DocumentEndEvent(start_mark, end_mark, + explicit=explicit) + + # Prepare the next state. + self.state = self.parse_document_start + + return event + + def parse_document_content(self): + if self.check_token(DirectiveToken, + DocumentStartToken, DocumentEndToken, StreamEndToken): + event = self.process_empty_scalar(self.peek_token().start_mark) + self.state = self.states.pop() + return event + else: + return self.parse_block_node() + + def process_directives(self): + self.yaml_version = None + self.tag_handles = {} + while self.check_token(DirectiveToken): + token = self.get_token() + if token.name == 'YAML': + if self.yaml_version is not None: + raise ParserError(None, None, + "found duplicate YAML directive", token.start_mark) + major, minor = token.value + if major != 1: + raise ParserError(None, None, + "found incompatible YAML document (version 1.* is required)", + token.start_mark) + self.yaml_version = token.value + elif token.name == 'TAG': + handle, prefix = token.value + if handle in self.tag_handles: + raise ParserError(None, None, + "duplicate tag handle %r" % handle, + token.start_mark) + self.tag_handles[handle] = prefix + if self.tag_handles: + value = self.yaml_version, self.tag_handles.copy() + else: + value = self.yaml_version, None + for key in self.DEFAULT_TAGS: + if key not in self.tag_handles: + self.tag_handles[key] = self.DEFAULT_TAGS[key] + return value + + # block_node_or_indentless_sequence ::= ALIAS + # | properties (block_content | indentless_block_sequence)? + # | block_content + # | indentless_block_sequence + # block_node ::= ALIAS + # | properties block_content? + # | block_content + # flow_node ::= ALIAS + # | properties flow_content? + # | flow_content + # properties ::= TAG ANCHOR? | ANCHOR TAG? + # block_content ::= block_collection | flow_collection | SCALAR + # flow_content ::= flow_collection | SCALAR + # block_collection ::= block_sequence | block_mapping + # flow_collection ::= flow_sequence | flow_mapping + + def parse_block_node(self): + return self.parse_node(block=True) + + def parse_flow_node(self): + return self.parse_node() + + def parse_block_node_or_indentless_sequence(self): + return self.parse_node(block=True, indentless_sequence=True) + + def parse_node(self, block=False, indentless_sequence=False): + if self.check_token(AliasToken): + token = self.get_token() + event = AliasEvent(token.value, token.start_mark, token.end_mark) + self.state = self.states.pop() + else: + anchor = None + tag = None + start_mark = end_mark = tag_mark = None + if self.check_token(AnchorToken): + token = self.get_token() + start_mark = token.start_mark + end_mark = token.end_mark + anchor = token.value + if self.check_token(TagToken): + token = self.get_token() + tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + elif self.check_token(TagToken): + token = self.get_token() + start_mark = tag_mark = token.start_mark + end_mark = token.end_mark + tag = token.value + if self.check_token(AnchorToken): + token = self.get_token() + end_mark = token.end_mark + anchor = token.value + if tag is not None: + handle, suffix = tag + if handle is not None: + if handle not in self.tag_handles: + raise ParserError("while parsing a node", start_mark, + "found undefined tag handle %r" % handle, + tag_mark) + tag = self.tag_handles[handle]+suffix + else: + tag = suffix + #if tag == '!': + # raise ParserError("while parsing a node", start_mark, + # "found non-specific tag '!'", tag_mark, + # "Please check 'http://pyyaml.org/wiki/YAMLNonSpecificTag' and share your opinion.") + if start_mark is None: + start_mark = end_mark = self.peek_token().start_mark + event = None + implicit = (tag is None or tag == '!') + if indentless_sequence and self.check_token(BlockEntryToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark) + self.state = self.parse_indentless_sequence_entry + else: + if self.check_token(ScalarToken): + token = self.get_token() + end_mark = token.end_mark + if (token.plain and tag is None) or tag == '!': + implicit = (True, False) + elif tag is None: + implicit = (False, True) + else: + implicit = (False, False) + event = ScalarEvent(anchor, tag, implicit, token.value, + start_mark, end_mark, style=token.style) + self.state = self.states.pop() + elif self.check_token(FlowSequenceStartToken): + end_mark = self.peek_token().end_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_sequence_first_entry + elif self.check_token(FlowMappingStartToken): + end_mark = self.peek_token().end_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=True) + self.state = self.parse_flow_mapping_first_key + elif block and self.check_token(BlockSequenceStartToken): + end_mark = self.peek_token().start_mark + event = SequenceStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_sequence_first_entry + elif block and self.check_token(BlockMappingStartToken): + end_mark = self.peek_token().start_mark + event = MappingStartEvent(anchor, tag, implicit, + start_mark, end_mark, flow_style=False) + self.state = self.parse_block_mapping_first_key + elif anchor is not None or tag is not None: + # Empty scalars are allowed even if a tag or an anchor is + # specified. + event = ScalarEvent(anchor, tag, (implicit, False), '', + start_mark, end_mark) + self.state = self.states.pop() + else: + if block: + node = 'block' + else: + node = 'flow' + token = self.peek_token() + raise ParserError("while parsing a %s node" % node, start_mark, + "expected the node content, but found %r" % token.id, + token.start_mark) + return event + + # block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + + def parse_block_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_sequence_entry() + + def parse_block_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, BlockEndToken): + self.states.append(self.parse_block_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_block_sequence_entry + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block collection", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + # indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + + def parse_indentless_sequence_entry(self): + if self.check_token(BlockEntryToken): + token = self.get_token() + if not self.check_token(BlockEntryToken, + KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_indentless_sequence_entry) + return self.parse_block_node() + else: + self.state = self.parse_indentless_sequence_entry + return self.process_empty_scalar(token.end_mark) + token = self.peek_token() + event = SequenceEndEvent(token.start_mark, token.start_mark) + self.state = self.states.pop() + return event + + # block_mapping ::= BLOCK-MAPPING_START + # ((KEY block_node_or_indentless_sequence?)? + # (VALUE block_node_or_indentless_sequence?)?)* + # BLOCK-END + + def parse_block_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_block_mapping_key() + + def parse_block_mapping_key(self): + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_value) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_value + return self.process_empty_scalar(token.end_mark) + if not self.check_token(BlockEndToken): + token = self.peek_token() + raise ParserError("while parsing a block mapping", self.marks[-1], + "expected , but found %r" % token.id, token.start_mark) + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_block_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(KeyToken, ValueToken, BlockEndToken): + self.states.append(self.parse_block_mapping_key) + return self.parse_block_node_or_indentless_sequence() + else: + self.state = self.parse_block_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_block_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + # flow_sequence ::= FLOW-SEQUENCE-START + # (flow_sequence_entry FLOW-ENTRY)* + # flow_sequence_entry? + # FLOW-SEQUENCE-END + # flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + # + # Note that while production rules for both flow_sequence_entry and + # flow_mapping_entry are equal, their interpretations are different. + # For `flow_sequence_entry`, the part `KEY flow_node? (VALUE flow_node?)?` + # generate an inline mapping (set syntax). + + def parse_flow_sequence_first_entry(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_sequence_entry(first=True) + + def parse_flow_sequence_entry(self, first=False): + if not self.check_token(FlowSequenceEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow sequence", self.marks[-1], + "expected ',' or ']', but got %r" % token.id, token.start_mark) + + if self.check_token(KeyToken): + token = self.peek_token() + event = MappingStartEvent(None, None, True, + token.start_mark, token.end_mark, + flow_style=True) + self.state = self.parse_flow_sequence_entry_mapping_key + return event + elif not self.check_token(FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry) + return self.parse_flow_node() + token = self.get_token() + event = SequenceEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_sequence_entry_mapping_key(self): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_value + return self.process_empty_scalar(token.end_mark) + + def parse_flow_sequence_entry_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowSequenceEndToken): + self.states.append(self.parse_flow_sequence_entry_mapping_end) + return self.parse_flow_node() + else: + self.state = self.parse_flow_sequence_entry_mapping_end + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_sequence_entry_mapping_end + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_sequence_entry_mapping_end(self): + self.state = self.parse_flow_sequence_entry + token = self.peek_token() + return MappingEndEvent(token.start_mark, token.start_mark) + + # flow_mapping ::= FLOW-MAPPING-START + # (flow_mapping_entry FLOW-ENTRY)* + # flow_mapping_entry? + # FLOW-MAPPING-END + # flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + + def parse_flow_mapping_first_key(self): + token = self.get_token() + self.marks.append(token.start_mark) + return self.parse_flow_mapping_key(first=True) + + def parse_flow_mapping_key(self, first=False): + if not self.check_token(FlowMappingEndToken): + if not first: + if self.check_token(FlowEntryToken): + self.get_token() + else: + token = self.peek_token() + raise ParserError("while parsing a flow mapping", self.marks[-1], + "expected ',' or '}', but got %r" % token.id, token.start_mark) + if self.check_token(KeyToken): + token = self.get_token() + if not self.check_token(ValueToken, + FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_value) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_value + return self.process_empty_scalar(token.end_mark) + elif not self.check_token(FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_empty_value) + return self.parse_flow_node() + token = self.get_token() + event = MappingEndEvent(token.start_mark, token.end_mark) + self.state = self.states.pop() + self.marks.pop() + return event + + def parse_flow_mapping_value(self): + if self.check_token(ValueToken): + token = self.get_token() + if not self.check_token(FlowEntryToken, FlowMappingEndToken): + self.states.append(self.parse_flow_mapping_key) + return self.parse_flow_node() + else: + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(token.end_mark) + else: + self.state = self.parse_flow_mapping_key + token = self.peek_token() + return self.process_empty_scalar(token.start_mark) + + def parse_flow_mapping_empty_value(self): + self.state = self.parse_flow_mapping_key + return self.process_empty_scalar(self.peek_token().start_mark) + + def process_empty_scalar(self, mark): + return ScalarEvent(None, None, (True, False), '', mark, mark) + diff --git a/python/pyyaml/lib3/yaml/reader.py b/python/pyyaml/lib3/yaml/reader.py new file mode 100644 index 000000000000..f70e920f4419 --- /dev/null +++ b/python/pyyaml/lib3/yaml/reader.py @@ -0,0 +1,192 @@ +# This module contains abstractions for the input stream. You don't have to +# looks further, there are no pretty code. +# +# We define two classes here. +# +# Mark(source, line, column) +# It's just a record and its only use is producing nice error messages. +# Parser does not use it for any other purposes. +# +# Reader(source, data) +# Reader determines the encoding of `data` and converts it to unicode. +# Reader provides the following methods and attributes: +# reader.peek(length=1) - return the next `length` characters +# reader.forward(length=1) - move the current position to `length` characters. +# reader.index - the number of the current character. +# reader.line, stream.column - the line and the column of the current character. + +__all__ = ['Reader', 'ReaderError'] + +from .error import YAMLError, Mark + +import codecs, re + +class ReaderError(YAMLError): + + def __init__(self, name, position, character, encoding, reason): + self.name = name + self.character = character + self.position = position + self.encoding = encoding + self.reason = reason + + def __str__(self): + if isinstance(self.character, bytes): + return "'%s' codec can't decode byte #x%02x: %s\n" \ + " in \"%s\", position %d" \ + % (self.encoding, ord(self.character), self.reason, + self.name, self.position) + else: + return "unacceptable character #x%04x: %s\n" \ + " in \"%s\", position %d" \ + % (self.character, self.reason, + self.name, self.position) + +class Reader(object): + # Reader: + # - determines the data encoding and converts it to a unicode string, + # - checks if characters are in allowed range, + # - adds '\0' to the end. + + # Reader accepts + # - a `bytes` object, + # - a `str` object, + # - a file-like object with its `read` method returning `str`, + # - a file-like object with its `read` method returning `unicode`. + + # Yeah, it's ugly and slow. + + def __init__(self, stream): + self.name = None + self.stream = None + self.stream_pointer = 0 + self.eof = True + self.buffer = '' + self.pointer = 0 + self.raw_buffer = None + self.raw_decode = None + self.encoding = None + self.index = 0 + self.line = 0 + self.column = 0 + if isinstance(stream, str): + self.name = "" + self.check_printable(stream) + self.buffer = stream+'\0' + elif isinstance(stream, bytes): + self.name = "" + self.raw_buffer = stream + self.determine_encoding() + else: + self.stream = stream + self.name = getattr(stream, 'name', "") + self.eof = False + self.raw_buffer = None + self.determine_encoding() + + def peek(self, index=0): + try: + return self.buffer[self.pointer+index] + except IndexError: + self.update(index+1) + return self.buffer[self.pointer+index] + + def prefix(self, length=1): + if self.pointer+length >= len(self.buffer): + self.update(length) + return self.buffer[self.pointer:self.pointer+length] + + def forward(self, length=1): + if self.pointer+length+1 >= len(self.buffer): + self.update(length+1) + while length: + ch = self.buffer[self.pointer] + self.pointer += 1 + self.index += 1 + if ch in '\n\x85\u2028\u2029' \ + or (ch == '\r' and self.buffer[self.pointer] != '\n'): + self.line += 1 + self.column = 0 + elif ch != '\uFEFF': + self.column += 1 + length -= 1 + + def get_mark(self): + if self.stream is None: + return Mark(self.name, self.index, self.line, self.column, + self.buffer, self.pointer) + else: + return Mark(self.name, self.index, self.line, self.column, + None, None) + + def determine_encoding(self): + while not self.eof and (self.raw_buffer is None or len(self.raw_buffer) < 2): + self.update_raw() + if isinstance(self.raw_buffer, bytes): + if self.raw_buffer.startswith(codecs.BOM_UTF16_LE): + self.raw_decode = codecs.utf_16_le_decode + self.encoding = 'utf-16-le' + elif self.raw_buffer.startswith(codecs.BOM_UTF16_BE): + self.raw_decode = codecs.utf_16_be_decode + self.encoding = 'utf-16-be' + else: + self.raw_decode = codecs.utf_8_decode + self.encoding = 'utf-8' + self.update(1) + + NON_PRINTABLE = re.compile('[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD]') + def check_printable(self, data): + match = self.NON_PRINTABLE.search(data) + if match: + character = match.group() + position = self.index+(len(self.buffer)-self.pointer)+match.start() + raise ReaderError(self.name, position, ord(character), + 'unicode', "special characters are not allowed") + + def update(self, length): + if self.raw_buffer is None: + return + self.buffer = self.buffer[self.pointer:] + self.pointer = 0 + while len(self.buffer) < length: + if not self.eof: + self.update_raw() + if self.raw_decode is not None: + try: + data, converted = self.raw_decode(self.raw_buffer, + 'strict', self.eof) + except UnicodeDecodeError as exc: + character = self.raw_buffer[exc.start] + if self.stream is not None: + position = self.stream_pointer-len(self.raw_buffer)+exc.start + else: + position = exc.start + raise ReaderError(self.name, position, character, + exc.encoding, exc.reason) + else: + data = self.raw_buffer + converted = len(data) + self.check_printable(data) + self.buffer += data + self.raw_buffer = self.raw_buffer[converted:] + if self.eof: + self.buffer += '\0' + self.raw_buffer = None + break + + def update_raw(self, size=4096): + data = self.stream.read(size) + if self.raw_buffer is None: + self.raw_buffer = data + else: + self.raw_buffer += data + self.stream_pointer += len(data) + if not data: + self.eof = True + +#try: +# import psyco +# psyco.bind(Reader) +#except ImportError: +# pass + diff --git a/python/pyyaml/lib3/yaml/representer.py b/python/pyyaml/lib3/yaml/representer.py new file mode 100644 index 000000000000..67cd6fd25e4a --- /dev/null +++ b/python/pyyaml/lib3/yaml/representer.py @@ -0,0 +1,374 @@ + +__all__ = ['BaseRepresenter', 'SafeRepresenter', 'Representer', + 'RepresenterError'] + +from .error import * +from .nodes import * + +import datetime, sys, copyreg, types, base64 + +class RepresenterError(YAMLError): + pass + +class BaseRepresenter: + + yaml_representers = {} + yaml_multi_representers = {} + + def __init__(self, default_style=None, default_flow_style=None): + self.default_style = default_style + self.default_flow_style = default_flow_style + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent(self, data): + node = self.represent_data(data) + self.serialize(node) + self.represented_objects = {} + self.object_keeper = [] + self.alias_key = None + + def represent_data(self, data): + if self.ignore_aliases(data): + self.alias_key = None + else: + self.alias_key = id(data) + if self.alias_key is not None: + if self.alias_key in self.represented_objects: + node = self.represented_objects[self.alias_key] + #if node is None: + # raise RepresenterError("recursive objects are not allowed: %r" % data) + return node + #self.represented_objects[alias_key] = None + self.object_keeper.append(data) + data_types = type(data).__mro__ + if data_types[0] in self.yaml_representers: + node = self.yaml_representers[data_types[0]](self, data) + else: + for data_type in data_types: + if data_type in self.yaml_multi_representers: + node = self.yaml_multi_representers[data_type](self, data) + break + else: + if None in self.yaml_multi_representers: + node = self.yaml_multi_representers[None](self, data) + elif None in self.yaml_representers: + node = self.yaml_representers[None](self, data) + else: + node = ScalarNode(None, str(data)) + #if alias_key is not None: + # self.represented_objects[alias_key] = node + return node + + @classmethod + def add_representer(cls, data_type, representer): + if not 'yaml_representers' in cls.__dict__: + cls.yaml_representers = cls.yaml_representers.copy() + cls.yaml_representers[data_type] = representer + + @classmethod + def add_multi_representer(cls, data_type, representer): + if not 'yaml_multi_representers' in cls.__dict__: + cls.yaml_multi_representers = cls.yaml_multi_representers.copy() + cls.yaml_multi_representers[data_type] = representer + + def represent_scalar(self, tag, value, style=None): + if style is None: + style = self.default_style + node = ScalarNode(tag, value, style=style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + return node + + def represent_sequence(self, tag, sequence, flow_style=None): + value = [] + node = SequenceNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + for item in sequence: + node_item = self.represent_data(item) + if not (isinstance(node_item, ScalarNode) and not node_item.style): + best_style = False + value.append(node_item) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def represent_mapping(self, tag, mapping, flow_style=None): + value = [] + node = MappingNode(tag, value, flow_style=flow_style) + if self.alias_key is not None: + self.represented_objects[self.alias_key] = node + best_style = True + if hasattr(mapping, 'items'): + mapping = list(mapping.items()) + try: + mapping = sorted(mapping) + except TypeError: + pass + for item_key, item_value in mapping: + node_key = self.represent_data(item_key) + node_value = self.represent_data(item_value) + if not (isinstance(node_key, ScalarNode) and not node_key.style): + best_style = False + if not (isinstance(node_value, ScalarNode) and not node_value.style): + best_style = False + value.append((node_key, node_value)) + if flow_style is None: + if self.default_flow_style is not None: + node.flow_style = self.default_flow_style + else: + node.flow_style = best_style + return node + + def ignore_aliases(self, data): + return False + +class SafeRepresenter(BaseRepresenter): + + def ignore_aliases(self, data): + if data in [None, ()]: + return True + if isinstance(data, (str, bytes, bool, int, float)): + return True + + def represent_none(self, data): + return self.represent_scalar('tag:yaml.org,2002:null', 'null') + + def represent_str(self, data): + return self.represent_scalar('tag:yaml.org,2002:str', data) + + def represent_binary(self, data): + if hasattr(base64, 'encodebytes'): + data = base64.encodebytes(data).decode('ascii') + else: + data = base64.encodestring(data).decode('ascii') + return self.represent_scalar('tag:yaml.org,2002:binary', data, style='|') + + def represent_bool(self, data): + if data: + value = 'true' + else: + value = 'false' + return self.represent_scalar('tag:yaml.org,2002:bool', value) + + def represent_int(self, data): + return self.represent_scalar('tag:yaml.org,2002:int', str(data)) + + inf_value = 1e300 + while repr(inf_value) != repr(inf_value*inf_value): + inf_value *= inf_value + + def represent_float(self, data): + if data != data or (data == 0.0 and data == 1.0): + value = '.nan' + elif data == self.inf_value: + value = '.inf' + elif data == -self.inf_value: + value = '-.inf' + else: + value = repr(data).lower() + # Note that in some cases `repr(data)` represents a float number + # without the decimal parts. For instance: + # >>> repr(1e17) + # '1e17' + # Unfortunately, this is not a valid float representation according + # to the definition of the `!!float` tag. We fix this by adding + # '.0' before the 'e' symbol. + if '.' not in value and 'e' in value: + value = value.replace('e', '.0e', 1) + return self.represent_scalar('tag:yaml.org,2002:float', value) + + def represent_list(self, data): + #pairs = (len(data) > 0 and isinstance(data, list)) + #if pairs: + # for item in data: + # if not isinstance(item, tuple) or len(item) != 2: + # pairs = False + # break + #if not pairs: + return self.represent_sequence('tag:yaml.org,2002:seq', data) + #value = [] + #for item_key, item_value in data: + # value.append(self.represent_mapping(u'tag:yaml.org,2002:map', + # [(item_key, item_value)])) + #return SequenceNode(u'tag:yaml.org,2002:pairs', value) + + def represent_dict(self, data): + return self.represent_mapping('tag:yaml.org,2002:map', data) + + def represent_set(self, data): + value = {} + for key in data: + value[key] = None + return self.represent_mapping('tag:yaml.org,2002:set', value) + + def represent_date(self, data): + value = data.isoformat() + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_datetime(self, data): + value = data.isoformat(' ') + return self.represent_scalar('tag:yaml.org,2002:timestamp', value) + + def represent_yaml_object(self, tag, data, cls, flow_style=None): + if hasattr(data, '__getstate__'): + state = data.__getstate__() + else: + state = data.__dict__.copy() + return self.represent_mapping(tag, state, flow_style=flow_style) + + def represent_undefined(self, data): + raise RepresenterError("cannot represent an object: %s" % data) + +SafeRepresenter.add_representer(type(None), + SafeRepresenter.represent_none) + +SafeRepresenter.add_representer(str, + SafeRepresenter.represent_str) + +SafeRepresenter.add_representer(bytes, + SafeRepresenter.represent_binary) + +SafeRepresenter.add_representer(bool, + SafeRepresenter.represent_bool) + +SafeRepresenter.add_representer(int, + SafeRepresenter.represent_int) + +SafeRepresenter.add_representer(float, + SafeRepresenter.represent_float) + +SafeRepresenter.add_representer(list, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(tuple, + SafeRepresenter.represent_list) + +SafeRepresenter.add_representer(dict, + SafeRepresenter.represent_dict) + +SafeRepresenter.add_representer(set, + SafeRepresenter.represent_set) + +SafeRepresenter.add_representer(datetime.date, + SafeRepresenter.represent_date) + +SafeRepresenter.add_representer(datetime.datetime, + SafeRepresenter.represent_datetime) + +SafeRepresenter.add_representer(None, + SafeRepresenter.represent_undefined) + +class Representer(SafeRepresenter): + + def represent_complex(self, data): + if data.imag == 0.0: + data = '%r' % data.real + elif data.real == 0.0: + data = '%rj' % data.imag + elif data.imag > 0: + data = '%r+%rj' % (data.real, data.imag) + else: + data = '%r%rj' % (data.real, data.imag) + return self.represent_scalar('tag:yaml.org,2002:python/complex', data) + + def represent_tuple(self, data): + return self.represent_sequence('tag:yaml.org,2002:python/tuple', data) + + def represent_name(self, data): + name = '%s.%s' % (data.__module__, data.__name__) + return self.represent_scalar('tag:yaml.org,2002:python/name:'+name, '') + + def represent_module(self, data): + return self.represent_scalar( + 'tag:yaml.org,2002:python/module:'+data.__name__, '') + + def represent_object(self, data): + # We use __reduce__ API to save the data. data.__reduce__ returns + # a tuple of length 2-5: + # (function, args, state, listitems, dictitems) + + # For reconstructing, we calls function(*args), then set its state, + # listitems, and dictitems if they are not None. + + # A special case is when function.__name__ == '__newobj__'. In this + # case we create the object with args[0].__new__(*args). + + # Another special case is when __reduce__ returns a string - we don't + # support it. + + # We produce a !!python/object, !!python/object/new or + # !!python/object/apply node. + + cls = type(data) + if cls in copyreg.dispatch_table: + reduce = copyreg.dispatch_table[cls](data) + elif hasattr(data, '__reduce_ex__'): + reduce = data.__reduce_ex__(2) + elif hasattr(data, '__reduce__'): + reduce = data.__reduce__() + else: + raise RepresenterError("cannot represent object: %r" % data) + reduce = (list(reduce)+[None]*5)[:5] + function, args, state, listitems, dictitems = reduce + args = list(args) + if state is None: + state = {} + if listitems is not None: + listitems = list(listitems) + if dictitems is not None: + dictitems = dict(dictitems) + if function.__name__ == '__newobj__': + function = args[0] + args = args[1:] + tag = 'tag:yaml.org,2002:python/object/new:' + newobj = True + else: + tag = 'tag:yaml.org,2002:python/object/apply:' + newobj = False + function_name = '%s.%s' % (function.__module__, function.__name__) + if not args and not listitems and not dictitems \ + and isinstance(state, dict) and newobj: + return self.represent_mapping( + 'tag:yaml.org,2002:python/object:'+function_name, state) + if not listitems and not dictitems \ + and isinstance(state, dict) and not state: + return self.represent_sequence(tag+function_name, args) + value = {} + if args: + value['args'] = args + if state or not isinstance(state, dict): + value['state'] = state + if listitems: + value['listitems'] = listitems + if dictitems: + value['dictitems'] = dictitems + return self.represent_mapping(tag+function_name, value) + +Representer.add_representer(complex, + Representer.represent_complex) + +Representer.add_representer(tuple, + Representer.represent_tuple) + +Representer.add_representer(type, + Representer.represent_name) + +Representer.add_representer(types.FunctionType, + Representer.represent_name) + +Representer.add_representer(types.BuiltinFunctionType, + Representer.represent_name) + +Representer.add_representer(types.ModuleType, + Representer.represent_module) + +Representer.add_multi_representer(object, + Representer.represent_object) + diff --git a/python/pyyaml/lib3/yaml/resolver.py b/python/pyyaml/lib3/yaml/resolver.py new file mode 100644 index 000000000000..0eece25821c6 --- /dev/null +++ b/python/pyyaml/lib3/yaml/resolver.py @@ -0,0 +1,224 @@ + +__all__ = ['BaseResolver', 'Resolver'] + +from .error import * +from .nodes import * + +import re + +class ResolverError(YAMLError): + pass + +class BaseResolver: + + DEFAULT_SCALAR_TAG = 'tag:yaml.org,2002:str' + DEFAULT_SEQUENCE_TAG = 'tag:yaml.org,2002:seq' + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map' + + yaml_implicit_resolvers = {} + yaml_path_resolvers = {} + + def __init__(self): + self.resolver_exact_paths = [] + self.resolver_prefix_paths = [] + + @classmethod + def add_implicit_resolver(cls, tag, regexp, first): + if not 'yaml_implicit_resolvers' in cls.__dict__: + cls.yaml_implicit_resolvers = cls.yaml_implicit_resolvers.copy() + if first is None: + first = [None] + for ch in first: + cls.yaml_implicit_resolvers.setdefault(ch, []).append((tag, regexp)) + + @classmethod + def add_path_resolver(cls, tag, path, kind=None): + # Note: `add_path_resolver` is experimental. The API could be changed. + # `new_path` is a pattern that is matched against the path from the + # root to the node that is being considered. `node_path` elements are + # tuples `(node_check, index_check)`. `node_check` is a node class: + # `ScalarNode`, `SequenceNode`, `MappingNode` or `None`. `None` + # matches any kind of a node. `index_check` could be `None`, a boolean + # value, a string value, or a number. `None` and `False` match against + # any _value_ of sequence and mapping nodes. `True` matches against + # any _key_ of a mapping node. A string `index_check` matches against + # a mapping value that corresponds to a scalar key which content is + # equal to the `index_check` value. An integer `index_check` matches + # against a sequence value with the index equal to `index_check`. + if not 'yaml_path_resolvers' in cls.__dict__: + cls.yaml_path_resolvers = cls.yaml_path_resolvers.copy() + new_path = [] + for element in path: + if isinstance(element, (list, tuple)): + if len(element) == 2: + node_check, index_check = element + elif len(element) == 1: + node_check = element[0] + index_check = True + else: + raise ResolverError("Invalid path element: %s" % element) + else: + node_check = None + index_check = element + if node_check is str: + node_check = ScalarNode + elif node_check is list: + node_check = SequenceNode + elif node_check is dict: + node_check = MappingNode + elif node_check not in [ScalarNode, SequenceNode, MappingNode] \ + and not isinstance(node_check, str) \ + and node_check is not None: + raise ResolverError("Invalid node checker: %s" % node_check) + if not isinstance(index_check, (str, int)) \ + and index_check is not None: + raise ResolverError("Invalid index checker: %s" % index_check) + new_path.append((node_check, index_check)) + if kind is str: + kind = ScalarNode + elif kind is list: + kind = SequenceNode + elif kind is dict: + kind = MappingNode + elif kind not in [ScalarNode, SequenceNode, MappingNode] \ + and kind is not None: + raise ResolverError("Invalid node kind: %s" % kind) + cls.yaml_path_resolvers[tuple(new_path), kind] = tag + + def descend_resolver(self, current_node, current_index): + if not self.yaml_path_resolvers: + return + exact_paths = {} + prefix_paths = [] + if current_node: + depth = len(self.resolver_prefix_paths) + for path, kind in self.resolver_prefix_paths[-1]: + if self.check_resolver_prefix(depth, path, kind, + current_node, current_index): + if len(path) > depth: + prefix_paths.append((path, kind)) + else: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + for path, kind in self.yaml_path_resolvers: + if not path: + exact_paths[kind] = self.yaml_path_resolvers[path, kind] + else: + prefix_paths.append((path, kind)) + self.resolver_exact_paths.append(exact_paths) + self.resolver_prefix_paths.append(prefix_paths) + + def ascend_resolver(self): + if not self.yaml_path_resolvers: + return + self.resolver_exact_paths.pop() + self.resolver_prefix_paths.pop() + + def check_resolver_prefix(self, depth, path, kind, + current_node, current_index): + node_check, index_check = path[depth-1] + if isinstance(node_check, str): + if current_node.tag != node_check: + return + elif node_check is not None: + if not isinstance(current_node, node_check): + return + if index_check is True and current_index is not None: + return + if (index_check is False or index_check is None) \ + and current_index is None: + return + if isinstance(index_check, str): + if not (isinstance(current_index, ScalarNode) + and index_check == current_index.value): + return + elif isinstance(index_check, int) and not isinstance(index_check, bool): + if index_check != current_index: + return + return True + + def resolve(self, kind, value, implicit): + if kind is ScalarNode and implicit[0]: + if value == '': + resolvers = self.yaml_implicit_resolvers.get('', []) + else: + resolvers = self.yaml_implicit_resolvers.get(value[0], []) + resolvers += self.yaml_implicit_resolvers.get(None, []) + for tag, regexp in resolvers: + if regexp.match(value): + return tag + implicit = implicit[1] + if self.yaml_path_resolvers: + exact_paths = self.resolver_exact_paths[-1] + if kind in exact_paths: + return exact_paths[kind] + if None in exact_paths: + return exact_paths[None] + if kind is ScalarNode: + return self.DEFAULT_SCALAR_TAG + elif kind is SequenceNode: + return self.DEFAULT_SEQUENCE_TAG + elif kind is MappingNode: + return self.DEFAULT_MAPPING_TAG + +class Resolver(BaseResolver): + pass + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:bool', + re.compile(r'''^(?:yes|Yes|YES|no|No|NO + |true|True|TRUE|false|False|FALSE + |on|On|ON|off|Off|OFF)$''', re.X), + list('yYnNtTfFoO')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:float', + re.compile(r'''^(?:[-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+][0-9]+)? + |\.[0-9_]+(?:[eE][-+][0-9]+)? + |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]* + |[-+]?\.(?:inf|Inf|INF) + |\.(?:nan|NaN|NAN))$''', re.X), + list('-+0123456789.')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:int', + re.compile(r'''^(?:[-+]?0b[0-1_]+ + |[-+]?0[0-7_]+ + |[-+]?(?:0|[1-9][0-9_]*) + |[-+]?0x[0-9a-fA-F_]+ + |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X), + list('-+0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:merge', + re.compile(r'^(?:<<)$'), + ['<']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:null', + re.compile(r'''^(?: ~ + |null|Null|NULL + | )$''', re.X), + ['~', 'n', 'N', '']) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:timestamp', + re.compile(r'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] + |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]? + (?:[Tt]|[ \t]+)[0-9][0-9]? + :[0-9][0-9] :[0-9][0-9] (?:\.[0-9]*)? + (?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X), + list('0123456789')) + +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:value', + re.compile(r'^(?:=)$'), + ['=']) + +# The following resolver is only for documentation purposes. It cannot work +# because plain scalars cannot start with '!', '&', or '*'. +Resolver.add_implicit_resolver( + 'tag:yaml.org,2002:yaml', + re.compile(r'^(?:!|&|\*)$'), + list('!&*')) + diff --git a/python/pyyaml/lib3/yaml/scanner.py b/python/pyyaml/lib3/yaml/scanner.py new file mode 100644 index 000000000000..494d975ba6e6 --- /dev/null +++ b/python/pyyaml/lib3/yaml/scanner.py @@ -0,0 +1,1448 @@ + +# Scanner produces tokens of the following types: +# STREAM-START +# STREAM-END +# DIRECTIVE(name, value) +# DOCUMENT-START +# DOCUMENT-END +# BLOCK-SEQUENCE-START +# BLOCK-MAPPING-START +# BLOCK-END +# FLOW-SEQUENCE-START +# FLOW-MAPPING-START +# FLOW-SEQUENCE-END +# FLOW-MAPPING-END +# BLOCK-ENTRY +# FLOW-ENTRY +# KEY +# VALUE +# ALIAS(value) +# ANCHOR(value) +# TAG(value) +# SCALAR(value, plain, style) +# +# Read comments in the Scanner code for more details. +# + +__all__ = ['Scanner', 'ScannerError'] + +from .error import MarkedYAMLError +from .tokens import * + +class ScannerError(MarkedYAMLError): + pass + +class SimpleKey: + # See below simple keys treatment. + + def __init__(self, token_number, required, index, line, column, mark): + self.token_number = token_number + self.required = required + self.index = index + self.line = line + self.column = column + self.mark = mark + +class Scanner: + + def __init__(self): + """Initialize the scanner.""" + # It is assumed that Scanner and Reader will have a common descendant. + # Reader do the dirty work of checking for BOM and converting the + # input data to Unicode. It also adds NUL to the end. + # + # Reader supports the following methods + # self.peek(i=0) # peek the next i-th character + # self.prefix(l=1) # peek the next l characters + # self.forward(l=1) # read the next l characters and move the pointer. + + # Had we reached the end of the stream? + self.done = False + + # The number of unclosed '{' and '['. `flow_level == 0` means block + # context. + self.flow_level = 0 + + # List of processed tokens that are not yet emitted. + self.tokens = [] + + # Add the STREAM-START token. + self.fetch_stream_start() + + # Number of tokens that were emitted through the `get_token` method. + self.tokens_taken = 0 + + # The current indentation level. + self.indent = -1 + + # Past indentation levels. + self.indents = [] + + # Variables related to simple keys treatment. + + # A simple key is a key that is not denoted by the '?' indicator. + # Example of simple keys: + # --- + # block simple key: value + # ? not a simple key: + # : { flow simple key: value } + # We emit the KEY token before all keys, so when we find a potential + # simple key, we try to locate the corresponding ':' indicator. + # Simple keys should be limited to a single line and 1024 characters. + + # Can a simple key start at the current position? A simple key may + # start: + # - at the beginning of the line, not counting indentation spaces + # (in block context), + # - after '{', '[', ',' (in the flow context), + # - after '?', ':', '-' (in the block context). + # In the block context, this flag also signifies if a block collection + # may start at the current position. + self.allow_simple_key = True + + # Keep track of possible simple keys. This is a dictionary. The key + # is `flow_level`; there can be no more that one possible simple key + # for each level. The value is a SimpleKey record: + # (token_number, required, index, line, column, mark) + # A simple key may start with ALIAS, ANCHOR, TAG, SCALAR(flow), + # '[', or '{' tokens. + self.possible_simple_keys = {} + + # Public methods. + + def check_token(self, *choices): + # Check if the next token is one of the given types. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + if not choices: + return True + for choice in choices: + if isinstance(self.tokens[0], choice): + return True + return False + + def peek_token(self): + # Return the next token, but do not delete if from the queue. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + return self.tokens[0] + + def get_token(self): + # Return the next token. + while self.need_more_tokens(): + self.fetch_more_tokens() + if self.tokens: + self.tokens_taken += 1 + return self.tokens.pop(0) + + # Private methods. + + def need_more_tokens(self): + if self.done: + return False + if not self.tokens: + return True + # The current token may be a potential simple key, so we + # need to look further. + self.stale_possible_simple_keys() + if self.next_possible_simple_key() == self.tokens_taken: + return True + + def fetch_more_tokens(self): + + # Eat whitespaces and comments until we reach the next token. + self.scan_to_next_token() + + # Remove obsolete possible simple keys. + self.stale_possible_simple_keys() + + # Compare the current indentation and column. It may add some tokens + # and decrease the current indentation level. + self.unwind_indent(self.column) + + # Peek the next character. + ch = self.peek() + + # Is it the end of stream? + if ch == '\0': + return self.fetch_stream_end() + + # Is it a directive? + if ch == '%' and self.check_directive(): + return self.fetch_directive() + + # Is it the document start? + if ch == '-' and self.check_document_start(): + return self.fetch_document_start() + + # Is it the document end? + if ch == '.' and self.check_document_end(): + return self.fetch_document_end() + + # TODO: support for BOM within a stream. + #if ch == '\uFEFF': + # return self.fetch_bom() <-- issue BOMToken + + # Note: the order of the following checks is NOT significant. + + # Is it the flow sequence start indicator? + if ch == '[': + return self.fetch_flow_sequence_start() + + # Is it the flow mapping start indicator? + if ch == '{': + return self.fetch_flow_mapping_start() + + # Is it the flow sequence end indicator? + if ch == ']': + return self.fetch_flow_sequence_end() + + # Is it the flow mapping end indicator? + if ch == '}': + return self.fetch_flow_mapping_end() + + # Is it the flow entry indicator? + if ch == ',': + return self.fetch_flow_entry() + + # Is it the block entry indicator? + if ch == '-' and self.check_block_entry(): + return self.fetch_block_entry() + + # Is it the key indicator? + if ch == '?' and self.check_key(): + return self.fetch_key() + + # Is it the value indicator? + if ch == ':' and self.check_value(): + return self.fetch_value() + + # Is it an alias? + if ch == '*': + return self.fetch_alias() + + # Is it an anchor? + if ch == '&': + return self.fetch_anchor() + + # Is it a tag? + if ch == '!': + return self.fetch_tag() + + # Is it a literal scalar? + if ch == '|' and not self.flow_level: + return self.fetch_literal() + + # Is it a folded scalar? + if ch == '>' and not self.flow_level: + return self.fetch_folded() + + # Is it a single quoted scalar? + if ch == '\'': + return self.fetch_single() + + # Is it a double quoted scalar? + if ch == '\"': + return self.fetch_double() + + # It must be a plain scalar then. + if self.check_plain(): + return self.fetch_plain() + + # No? It's an error. Let's produce a nice error message. + raise ScannerError("while scanning for the next token", None, + "found character %r that cannot start any token" % ch, + self.get_mark()) + + # Simple keys treatment. + + def next_possible_simple_key(self): + # Return the number of the nearest possible simple key. Actually we + # don't need to loop through the whole dictionary. We may replace it + # with the following code: + # if not self.possible_simple_keys: + # return None + # return self.possible_simple_keys[ + # min(self.possible_simple_keys.keys())].token_number + min_token_number = None + for level in self.possible_simple_keys: + key = self.possible_simple_keys[level] + if min_token_number is None or key.token_number < min_token_number: + min_token_number = key.token_number + return min_token_number + + def stale_possible_simple_keys(self): + # Remove entries that are no longer possible simple keys. According to + # the YAML specification, simple keys + # - should be limited to a single line, + # - should be no longer than 1024 characters. + # Disabling this procedure will allow simple keys of any length and + # height (may cause problems if indentation is broken though). + for level in list(self.possible_simple_keys): + key = self.possible_simple_keys[level] + if key.line != self.line \ + or self.index-key.index > 1024: + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not found expected ':'", self.get_mark()) + del self.possible_simple_keys[level] + + def save_possible_simple_key(self): + # The next token may start a simple key. We check if it's possible + # and save its position. This function is called for + # ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'. + + # Check if a simple key is required at the current position. + required = not self.flow_level and self.indent == self.column + + # A simple key is required only if it is the first token in the current + # line. Therefore it is always allowed. + assert self.allow_simple_key or not required + + # The next token might be a simple key. Let's save it's number and + # position. + if self.allow_simple_key: + self.remove_possible_simple_key() + token_number = self.tokens_taken+len(self.tokens) + key = SimpleKey(token_number, required, + self.index, self.line, self.column, self.get_mark()) + self.possible_simple_keys[self.flow_level] = key + + def remove_possible_simple_key(self): + # Remove the saved possible key position at the current flow level. + if self.flow_level in self.possible_simple_keys: + key = self.possible_simple_keys[self.flow_level] + + if key.required: + raise ScannerError("while scanning a simple key", key.mark, + "could not found expected ':'", self.get_mark()) + + del self.possible_simple_keys[self.flow_level] + + # Indentation functions. + + def unwind_indent(self, column): + + ## In flow context, tokens should respect indentation. + ## Actually the condition should be `self.indent >= column` according to + ## the spec. But this condition will prohibit intuitively correct + ## constructions such as + ## key : { + ## } + #if self.flow_level and self.indent > column: + # raise ScannerError(None, None, + # "invalid intendation or unclosed '[' or '{'", + # self.get_mark()) + + # In the flow context, indentation is ignored. We make the scanner less + # restrictive then specification requires. + if self.flow_level: + return + + # In block context, we may need to issue the BLOCK-END tokens. + while self.indent > column: + mark = self.get_mark() + self.indent = self.indents.pop() + self.tokens.append(BlockEndToken(mark, mark)) + + def add_indent(self, column): + # Check if we need to increase indentation. + if self.indent < column: + self.indents.append(self.indent) + self.indent = column + return True + return False + + # Fetchers. + + def fetch_stream_start(self): + # We always add STREAM-START as the first token and STREAM-END as the + # last token. + + # Read the token. + mark = self.get_mark() + + # Add STREAM-START. + self.tokens.append(StreamStartToken(mark, mark, + encoding=self.encoding)) + + + def fetch_stream_end(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + self.possible_simple_keys = {} + + # Read the token. + mark = self.get_mark() + + # Add STREAM-END. + self.tokens.append(StreamEndToken(mark, mark)) + + # The steam is finished. + self.done = True + + def fetch_directive(self): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Scan and add DIRECTIVE. + self.tokens.append(self.scan_directive()) + + def fetch_document_start(self): + self.fetch_document_indicator(DocumentStartToken) + + def fetch_document_end(self): + self.fetch_document_indicator(DocumentEndToken) + + def fetch_document_indicator(self, TokenClass): + + # Set the current intendation to -1. + self.unwind_indent(-1) + + # Reset simple keys. Note that there could not be a block collection + # after '---'. + self.remove_possible_simple_key() + self.allow_simple_key = False + + # Add DOCUMENT-START or DOCUMENT-END. + start_mark = self.get_mark() + self.forward(3) + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_start(self): + self.fetch_flow_collection_start(FlowSequenceStartToken) + + def fetch_flow_mapping_start(self): + self.fetch_flow_collection_start(FlowMappingStartToken) + + def fetch_flow_collection_start(self, TokenClass): + + # '[' and '{' may start a simple key. + self.save_possible_simple_key() + + # Increase the flow level. + self.flow_level += 1 + + # Simple keys are allowed after '[' and '{'. + self.allow_simple_key = True + + # Add FLOW-SEQUENCE-START or FLOW-MAPPING-START. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_sequence_end(self): + self.fetch_flow_collection_end(FlowSequenceEndToken) + + def fetch_flow_mapping_end(self): + self.fetch_flow_collection_end(FlowMappingEndToken) + + def fetch_flow_collection_end(self, TokenClass): + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Decrease the flow level. + self.flow_level -= 1 + + # No simple keys after ']' or '}'. + self.allow_simple_key = False + + # Add FLOW-SEQUENCE-END or FLOW-MAPPING-END. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(TokenClass(start_mark, end_mark)) + + def fetch_flow_entry(self): + + # Simple keys are allowed after ','. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add FLOW-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(FlowEntryToken(start_mark, end_mark)) + + def fetch_block_entry(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a new entry? + if not self.allow_simple_key: + raise ScannerError(None, None, + "sequence entries are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-SEQUENCE-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockSequenceStartToken(mark, mark)) + + # It's an error for the block entry to occur in the flow context, + # but we let the parser detect this. + else: + pass + + # Simple keys are allowed after '-'. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add BLOCK-ENTRY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(BlockEntryToken(start_mark, end_mark)) + + def fetch_key(self): + + # Block context needs additional checks. + if not self.flow_level: + + # Are we allowed to start a key (not nessesary a simple)? + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping keys are not allowed here", + self.get_mark()) + + # We may need to add BLOCK-MAPPING-START. + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after '?' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add KEY. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(KeyToken(start_mark, end_mark)) + + def fetch_value(self): + + # Do we determine a simple key? + if self.flow_level in self.possible_simple_keys: + + # Add KEY. + key = self.possible_simple_keys[self.flow_level] + del self.possible_simple_keys[self.flow_level] + self.tokens.insert(key.token_number-self.tokens_taken, + KeyToken(key.mark, key.mark)) + + # If this key starts a new block mapping, we need to add + # BLOCK-MAPPING-START. + if not self.flow_level: + if self.add_indent(key.column): + self.tokens.insert(key.token_number-self.tokens_taken, + BlockMappingStartToken(key.mark, key.mark)) + + # There cannot be two simple keys one after another. + self.allow_simple_key = False + + # It must be a part of a complex key. + else: + + # Block context needs additional checks. + # (Do we really need them? They will be catched by the parser + # anyway.) + if not self.flow_level: + + # We are allowed to start a complex value if and only if + # we can start a simple key. + if not self.allow_simple_key: + raise ScannerError(None, None, + "mapping values are not allowed here", + self.get_mark()) + + # If this value starts a new block mapping, we need to add + # BLOCK-MAPPING-START. It will be detected as an error later by + # the parser. + if not self.flow_level: + if self.add_indent(self.column): + mark = self.get_mark() + self.tokens.append(BlockMappingStartToken(mark, mark)) + + # Simple keys are allowed after ':' in the block context. + self.allow_simple_key = not self.flow_level + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Add VALUE. + start_mark = self.get_mark() + self.forward() + end_mark = self.get_mark() + self.tokens.append(ValueToken(start_mark, end_mark)) + + def fetch_alias(self): + + # ALIAS could be a simple key. + self.save_possible_simple_key() + + # No simple keys after ALIAS. + self.allow_simple_key = False + + # Scan and add ALIAS. + self.tokens.append(self.scan_anchor(AliasToken)) + + def fetch_anchor(self): + + # ANCHOR could start a simple key. + self.save_possible_simple_key() + + # No simple keys after ANCHOR. + self.allow_simple_key = False + + # Scan and add ANCHOR. + self.tokens.append(self.scan_anchor(AnchorToken)) + + def fetch_tag(self): + + # TAG could start a simple key. + self.save_possible_simple_key() + + # No simple keys after TAG. + self.allow_simple_key = False + + # Scan and add TAG. + self.tokens.append(self.scan_tag()) + + def fetch_literal(self): + self.fetch_block_scalar(style='|') + + def fetch_folded(self): + self.fetch_block_scalar(style='>') + + def fetch_block_scalar(self, style): + + # A simple key may follow a block scalar. + self.allow_simple_key = True + + # Reset possible simple key on the current level. + self.remove_possible_simple_key() + + # Scan and add SCALAR. + self.tokens.append(self.scan_block_scalar(style)) + + def fetch_single(self): + self.fetch_flow_scalar(style='\'') + + def fetch_double(self): + self.fetch_flow_scalar(style='"') + + def fetch_flow_scalar(self, style): + + # A flow scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after flow scalars. + self.allow_simple_key = False + + # Scan and add SCALAR. + self.tokens.append(self.scan_flow_scalar(style)) + + def fetch_plain(self): + + # A plain scalar could be a simple key. + self.save_possible_simple_key() + + # No simple keys after plain scalars. But note that `scan_plain` will + # change this flag if the scan is finished at the beginning of the + # line. + self.allow_simple_key = False + + # Scan and add SCALAR. May change `allow_simple_key`. + self.tokens.append(self.scan_plain()) + + # Checkers. + + def check_directive(self): + + # DIRECTIVE: ^ '%' ... + # The '%' indicator is already checked. + if self.column == 0: + return True + + def check_document_start(self): + + # DOCUMENT-START: ^ '---' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '---' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_document_end(self): + + # DOCUMENT-END: ^ '...' (' '|'\n') + if self.column == 0: + if self.prefix(3) == '...' \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return True + + def check_block_entry(self): + + # BLOCK-ENTRY: '-' (' '|'\n') + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_key(self): + + # KEY(flow context): '?' + if self.flow_level: + return True + + # KEY(block context): '?' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_value(self): + + # VALUE(flow context): ':' + if self.flow_level: + return True + + # VALUE(block context): ':' (' '|'\n') + else: + return self.peek(1) in '\0 \t\r\n\x85\u2028\u2029' + + def check_plain(self): + + # A plain scalar may start with any non-space character except: + # '-', '?', ':', ',', '[', ']', '{', '}', + # '#', '&', '*', '!', '|', '>', '\'', '\"', + # '%', '@', '`'. + # + # It may also start with + # '-', '?', ':' + # if it is followed by a non-space character. + # + # Note that we limit the last rule to the block context (except the + # '-' character) because we want the flow context to be space + # independent. + ch = self.peek() + return ch not in '\0 \t\r\n\x85\u2028\u2029-?:,[]{}#&*!|>\'\"%@`' \ + or (self.peek(1) not in '\0 \t\r\n\x85\u2028\u2029' + and (ch == '-' or (not self.flow_level and ch in '?:'))) + + # Scanners. + + def scan_to_next_token(self): + # We ignore spaces, line breaks and comments. + # If we find a line break in the block context, we set the flag + # `allow_simple_key` on. + # The byte order mark is stripped if it's the first character in the + # stream. We do not yet support BOM inside the stream as the + # specification requires. Any such mark will be considered as a part + # of the document. + # + # TODO: We need to make tab handling rules more sane. A good rule is + # Tabs cannot precede tokens + # BLOCK-SEQUENCE-START, BLOCK-MAPPING-START, BLOCK-END, + # KEY(block), VALUE(block), BLOCK-ENTRY + # So the checking code is + # if : + # self.allow_simple_keys = False + # We also need to add the check for `allow_simple_keys == True` to + # `unwind_indent` before issuing BLOCK-END. + # Scanners for block, flow, and plain scalars need to be modified. + + if self.index == 0 and self.peek() == '\uFEFF': + self.forward() + found = False + while not found: + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + if self.scan_line_break(): + if not self.flow_level: + self.allow_simple_key = True + else: + found = True + + def scan_directive(self): + # See the specification for details. + start_mark = self.get_mark() + self.forward() + name = self.scan_directive_name(start_mark) + value = None + if name == 'YAML': + value = self.scan_yaml_directive_value(start_mark) + end_mark = self.get_mark() + elif name == 'TAG': + value = self.scan_tag_directive_value(start_mark) + end_mark = self.get_mark() + else: + end_mark = self.get_mark() + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + self.scan_directive_ignored_line(start_mark) + return DirectiveToken(name, value, start_mark, end_mark) + + def scan_directive_name(self, start_mark): + # See the specification for details. + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + return value + + def scan_yaml_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + major = self.scan_yaml_directive_number(start_mark) + if self.peek() != '.': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or '.', but found %r" % self.peek(), + self.get_mark()) + self.forward() + minor = self.scan_yaml_directive_number(start_mark) + if self.peek() not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a digit or ' ', but found %r" % self.peek(), + self.get_mark()) + return (major, minor) + + def scan_yaml_directive_number(self, start_mark): + # See the specification for details. + ch = self.peek() + if not ('0' <= ch <= '9'): + raise ScannerError("while scanning a directive", start_mark, + "expected a digit, but found %r" % ch, self.get_mark()) + length = 0 + while '0' <= self.peek(length) <= '9': + length += 1 + value = int(self.prefix(length)) + self.forward(length) + return value + + def scan_tag_directive_value(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + handle = self.scan_tag_directive_handle(start_mark) + while self.peek() == ' ': + self.forward() + prefix = self.scan_tag_directive_prefix(start_mark) + return (handle, prefix) + + def scan_tag_directive_handle(self, start_mark): + # See the specification for details. + value = self.scan_tag_handle('directive', start_mark) + ch = self.peek() + if ch != ' ': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_tag_directive_prefix(self, start_mark): + # See the specification for details. + value = self.scan_tag_uri('directive', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + return value + + def scan_directive_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a directive", start_mark, + "expected a comment or a line break, but found %r" + % ch, self.get_mark()) + self.scan_line_break() + + def scan_anchor(self, TokenClass): + # The specification does not restrict characters for anchors and + # aliases. This may lead to problems, for instance, the document: + # [ *alias, value ] + # can be interpteted in two ways, as + # [ "value" ] + # and + # [ *alias , "value" ] + # Therefore we restrict aliases to numbers and ASCII letters. + start_mark = self.get_mark() + indicator = self.peek() + if indicator == '*': + name = 'alias' + else: + name = 'anchor' + self.forward() + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if not length: + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + value = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch not in '\0 \t\r\n\x85\u2028\u2029?:,]}%@`': + raise ScannerError("while scanning an %s" % name, start_mark, + "expected alphabetic or numeric character, but found %r" + % ch, self.get_mark()) + end_mark = self.get_mark() + return TokenClass(value, start_mark, end_mark) + + def scan_tag(self): + # See the specification for details. + start_mark = self.get_mark() + ch = self.peek(1) + if ch == '<': + handle = None + self.forward(2) + suffix = self.scan_tag_uri('tag', start_mark) + if self.peek() != '>': + raise ScannerError("while parsing a tag", start_mark, + "expected '>', but found %r" % self.peek(), + self.get_mark()) + self.forward() + elif ch in '\0 \t\r\n\x85\u2028\u2029': + handle = None + suffix = '!' + self.forward() + else: + length = 1 + use_handle = False + while ch not in '\0 \r\n\x85\u2028\u2029': + if ch == '!': + use_handle = True + break + length += 1 + ch = self.peek(length) + handle = '!' + if use_handle: + handle = self.scan_tag_handle('tag', start_mark) + else: + handle = '!' + self.forward() + suffix = self.scan_tag_uri('tag', start_mark) + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a tag", start_mark, + "expected ' ', but found %r" % ch, self.get_mark()) + value = (handle, suffix) + end_mark = self.get_mark() + return TagToken(value, start_mark, end_mark) + + def scan_block_scalar(self, style): + # See the specification for details. + + if style == '>': + folded = True + else: + folded = False + + chunks = [] + start_mark = self.get_mark() + + # Scan the header. + self.forward() + chomping, increment = self.scan_block_scalar_indicators(start_mark) + self.scan_block_scalar_ignored_line(start_mark) + + # Determine the indentation level and go to the first non-empty line. + min_indent = self.indent+1 + if min_indent < 1: + min_indent = 1 + if increment is None: + breaks, max_indent, end_mark = self.scan_block_scalar_indentation() + indent = max(min_indent, max_indent) + else: + indent = min_indent+increment-1 + breaks, end_mark = self.scan_block_scalar_breaks(indent) + line_break = '' + + # Scan the inner part of the block scalar. + while self.column == indent and self.peek() != '\0': + chunks.extend(breaks) + leading_non_space = self.peek() not in ' \t' + length = 0 + while self.peek(length) not in '\0\r\n\x85\u2028\u2029': + length += 1 + chunks.append(self.prefix(length)) + self.forward(length) + line_break = self.scan_line_break() + breaks, end_mark = self.scan_block_scalar_breaks(indent) + if self.column == indent and self.peek() != '\0': + + # Unfortunately, folding rules are ambiguous. + # + # This is the folding according to the specification: + + if folded and line_break == '\n' \ + and leading_non_space and self.peek() not in ' \t': + if not breaks: + chunks.append(' ') + else: + chunks.append(line_break) + + # This is Clark Evans's interpretation (also in the spec + # examples): + # + #if folded and line_break == '\n': + # if not breaks: + # if self.peek() not in ' \t': + # chunks.append(' ') + # else: + # chunks.append(line_break) + #else: + # chunks.append(line_break) + else: + break + + # Chomp the tail. + if chomping is not False: + chunks.append(line_break) + if chomping is True: + chunks.extend(breaks) + + # We are done. + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + def scan_block_scalar_indicators(self, start_mark): + # See the specification for details. + chomping = None + increment = None + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + elif ch in '0123456789': + increment = int(ch) + if increment == 0: + raise ScannerError("while scanning a block scalar", start_mark, + "expected indentation indicator in the range 1-9, but found 0", + self.get_mark()) + self.forward() + ch = self.peek() + if ch in '+-': + if ch == '+': + chomping = True + else: + chomping = False + self.forward() + ch = self.peek() + if ch not in '\0 \r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected chomping or indentation indicators, but found %r" + % ch, self.get_mark()) + return chomping, increment + + def scan_block_scalar_ignored_line(self, start_mark): + # See the specification for details. + while self.peek() == ' ': + self.forward() + if self.peek() == '#': + while self.peek() not in '\0\r\n\x85\u2028\u2029': + self.forward() + ch = self.peek() + if ch not in '\0\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a block scalar", start_mark, + "expected a comment or a line break, but found %r" % ch, + self.get_mark()) + self.scan_line_break() + + def scan_block_scalar_indentation(self): + # See the specification for details. + chunks = [] + max_indent = 0 + end_mark = self.get_mark() + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() != ' ': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + else: + self.forward() + if self.column > max_indent: + max_indent = self.column + return chunks, max_indent, end_mark + + def scan_block_scalar_breaks(self, indent): + # See the specification for details. + chunks = [] + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + while self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + end_mark = self.get_mark() + while self.column < indent and self.peek() == ' ': + self.forward() + return chunks, end_mark + + def scan_flow_scalar(self, style): + # See the specification for details. + # Note that we loose indentation rules for quoted scalars. Quoted + # scalars don't need to adhere indentation because " and ' clearly + # mark the beginning and the end of them. Therefore we are less + # restrictive then the specification requires. We only need to check + # that document separators are not included in scalars. + if style == '"': + double = True + else: + double = False + chunks = [] + start_mark = self.get_mark() + quote = self.peek() + self.forward() + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + while self.peek() != quote: + chunks.extend(self.scan_flow_scalar_spaces(double, start_mark)) + chunks.extend(self.scan_flow_scalar_non_spaces(double, start_mark)) + self.forward() + end_mark = self.get_mark() + return ScalarToken(''.join(chunks), False, start_mark, end_mark, + style) + + ESCAPE_REPLACEMENTS = { + '0': '\0', + 'a': '\x07', + 'b': '\x08', + 't': '\x09', + '\t': '\x09', + 'n': '\x0A', + 'v': '\x0B', + 'f': '\x0C', + 'r': '\x0D', + 'e': '\x1B', + ' ': '\x20', + '\"': '\"', + '\\': '\\', + 'N': '\x85', + '_': '\xA0', + 'L': '\u2028', + 'P': '\u2029', + } + + ESCAPE_CODES = { + 'x': 2, + 'u': 4, + 'U': 8, + } + + def scan_flow_scalar_non_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + length = 0 + while self.peek(length) not in '\'\"\\\0 \t\r\n\x85\u2028\u2029': + length += 1 + if length: + chunks.append(self.prefix(length)) + self.forward(length) + ch = self.peek() + if not double and ch == '\'' and self.peek(1) == '\'': + chunks.append('\'') + self.forward(2) + elif (double and ch == '\'') or (not double and ch in '\"\\'): + chunks.append(ch) + self.forward() + elif double and ch == '\\': + self.forward() + ch = self.peek() + if ch in self.ESCAPE_REPLACEMENTS: + chunks.append(self.ESCAPE_REPLACEMENTS[ch]) + self.forward() + elif ch in self.ESCAPE_CODES: + length = self.ESCAPE_CODES[ch] + self.forward() + for k in range(length): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "expected escape sequence of %d hexdecimal numbers, but found %r" % + (length, self.peek(k)), self.get_mark()) + code = int(self.prefix(length), 16) + chunks.append(chr(code)) + self.forward(length) + elif ch in '\r\n\x85\u2028\u2029': + self.scan_line_break() + chunks.extend(self.scan_flow_scalar_breaks(double, start_mark)) + else: + raise ScannerError("while scanning a double-quoted scalar", start_mark, + "found unknown escape character %r" % ch, self.get_mark()) + else: + return chunks + + def scan_flow_scalar_spaces(self, double, start_mark): + # See the specification for details. + chunks = [] + length = 0 + while self.peek(length) in ' \t': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch == '\0': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected end of stream", self.get_mark()) + elif ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + breaks = self.scan_flow_scalar_breaks(double, start_mark) + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + else: + chunks.append(whitespaces) + return chunks + + def scan_flow_scalar_breaks(self, double, start_mark): + # See the specification for details. + chunks = [] + while True: + # Instead of checking indentation, we check for document + # separators. + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + raise ScannerError("while scanning a quoted scalar", start_mark, + "found unexpected document separator", self.get_mark()) + while self.peek() in ' \t': + self.forward() + if self.peek() in '\r\n\x85\u2028\u2029': + chunks.append(self.scan_line_break()) + else: + return chunks + + def scan_plain(self): + # See the specification for details. + # We add an additional restriction for the flow context: + # plain scalars in the flow context cannot contain ',', ':' and '?'. + # We also keep track of the `allow_simple_key` flag here. + # Indentation rules are loosed for the flow context. + chunks = [] + start_mark = self.get_mark() + end_mark = start_mark + indent = self.indent+1 + # We allow zero indentation for scalars, but then we need to check for + # document separators at the beginning of the line. + #if indent == 0: + # indent = 1 + spaces = [] + while True: + length = 0 + if self.peek() == '#': + break + while True: + ch = self.peek(length) + if ch in '\0 \t\r\n\x85\u2028\u2029' \ + or (not self.flow_level and ch == ':' and + self.peek(length+1) in '\0 \t\r\n\x85\u2028\u2029') \ + or (self.flow_level and ch in ',:?[]{}'): + break + length += 1 + # It's not clear what we should do with ':' in the flow context. + if (self.flow_level and ch == ':' + and self.peek(length+1) not in '\0 \t\r\n\x85\u2028\u2029,[]{}'): + self.forward(length) + raise ScannerError("while scanning a plain scalar", start_mark, + "found unexpected ':'", self.get_mark(), + "Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.") + if length == 0: + break + self.allow_simple_key = False + chunks.extend(spaces) + chunks.append(self.prefix(length)) + self.forward(length) + end_mark = self.get_mark() + spaces = self.scan_plain_spaces(indent, start_mark) + if not spaces or self.peek() == '#' \ + or (not self.flow_level and self.column < indent): + break + return ScalarToken(''.join(chunks), True, start_mark, end_mark) + + def scan_plain_spaces(self, indent, start_mark): + # See the specification for details. + # The specification is really confusing about tabs in plain scalars. + # We just forbid them completely. Do not use tabs in YAML! + chunks = [] + length = 0 + while self.peek(length) in ' ': + length += 1 + whitespaces = self.prefix(length) + self.forward(length) + ch = self.peek() + if ch in '\r\n\x85\u2028\u2029': + line_break = self.scan_line_break() + self.allow_simple_key = True + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + breaks = [] + while self.peek() in ' \r\n\x85\u2028\u2029': + if self.peek() == ' ': + self.forward() + else: + breaks.append(self.scan_line_break()) + prefix = self.prefix(3) + if (prefix == '---' or prefix == '...') \ + and self.peek(3) in '\0 \t\r\n\x85\u2028\u2029': + return + if line_break != '\n': + chunks.append(line_break) + elif not breaks: + chunks.append(' ') + chunks.extend(breaks) + elif whitespaces: + chunks.append(whitespaces) + return chunks + + def scan_tag_handle(self, name, start_mark): + # See the specification for details. + # For some strange reasons, the specification does not allow '_' in + # tag handles. I have allowed it anyway. + ch = self.peek() + if ch != '!': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length = 1 + ch = self.peek(length) + if ch != ' ': + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-_': + length += 1 + ch = self.peek(length) + if ch != '!': + self.forward(length) + raise ScannerError("while scanning a %s" % name, start_mark, + "expected '!', but found %r" % ch, self.get_mark()) + length += 1 + value = self.prefix(length) + self.forward(length) + return value + + def scan_tag_uri(self, name, start_mark): + # See the specification for details. + # Note: we do not check if URI is well-formed. + chunks = [] + length = 0 + ch = self.peek(length) + while '0' <= ch <= '9' or 'A' <= ch <= 'Z' or 'a' <= ch <= 'z' \ + or ch in '-;/?:@&=+$,_.!~*\'()[]%': + if ch == '%': + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + chunks.append(self.scan_uri_escapes(name, start_mark)) + else: + length += 1 + ch = self.peek(length) + if length: + chunks.append(self.prefix(length)) + self.forward(length) + length = 0 + if not chunks: + raise ScannerError("while parsing a %s" % name, start_mark, + "expected URI, but found %r" % ch, self.get_mark()) + return ''.join(chunks) + + def scan_uri_escapes(self, name, start_mark): + # See the specification for details. + codes = [] + mark = self.get_mark() + while self.peek() == '%': + self.forward() + for k in range(2): + if self.peek(k) not in '0123456789ABCDEFabcdef': + raise ScannerError("while scanning a %s" % name, start_mark, + "expected URI escape sequence of 2 hexdecimal numbers, but found %r" + % self.peek(k), self.get_mark()) + codes.append(int(self.prefix(2), 16)) + self.forward(2) + try: + value = bytes(codes).decode('utf-8') + except UnicodeDecodeError as exc: + raise ScannerError("while scanning a %s" % name, start_mark, str(exc), mark) + return value + + def scan_line_break(self): + # Transforms: + # '\r\n' : '\n' + # '\r' : '\n' + # '\n' : '\n' + # '\x85' : '\n' + # '\u2028' : '\u2028' + # '\u2029 : '\u2029' + # default : '' + ch = self.peek() + if ch in '\r\n\x85': + if self.prefix(2) == '\r\n': + self.forward(2) + else: + self.forward() + return '\n' + elif ch in '\u2028\u2029': + self.forward() + return ch + return '' + +#try: +# import psyco +# psyco.bind(Scanner) +#except ImportError: +# pass + diff --git a/python/pyyaml/lib3/yaml/serializer.py b/python/pyyaml/lib3/yaml/serializer.py new file mode 100644 index 000000000000..fe911e67ae7a --- /dev/null +++ b/python/pyyaml/lib3/yaml/serializer.py @@ -0,0 +1,111 @@ + +__all__ = ['Serializer', 'SerializerError'] + +from .error import YAMLError +from .events import * +from .nodes import * + +class SerializerError(YAMLError): + pass + +class Serializer: + + ANCHOR_TEMPLATE = 'id%03d' + + def __init__(self, encoding=None, + explicit_start=None, explicit_end=None, version=None, tags=None): + self.use_encoding = encoding + self.use_explicit_start = explicit_start + self.use_explicit_end = explicit_end + self.use_version = version + self.use_tags = tags + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + self.closed = None + + def open(self): + if self.closed is None: + self.emit(StreamStartEvent(encoding=self.use_encoding)) + self.closed = False + elif self.closed: + raise SerializerError("serializer is closed") + else: + raise SerializerError("serializer is already opened") + + def close(self): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif not self.closed: + self.emit(StreamEndEvent()) + self.closed = True + + #def __del__(self): + # self.close() + + def serialize(self, node): + if self.closed is None: + raise SerializerError("serializer is not opened") + elif self.closed: + raise SerializerError("serializer is closed") + self.emit(DocumentStartEvent(explicit=self.use_explicit_start, + version=self.use_version, tags=self.use_tags)) + self.anchor_node(node) + self.serialize_node(node, None, None) + self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) + self.serialized_nodes = {} + self.anchors = {} + self.last_anchor_id = 0 + + def anchor_node(self, node): + if node in self.anchors: + if self.anchors[node] is None: + self.anchors[node] = self.generate_anchor(node) + else: + self.anchors[node] = None + if isinstance(node, SequenceNode): + for item in node.value: + self.anchor_node(item) + elif isinstance(node, MappingNode): + for key, value in node.value: + self.anchor_node(key) + self.anchor_node(value) + + def generate_anchor(self, node): + self.last_anchor_id += 1 + return self.ANCHOR_TEMPLATE % self.last_anchor_id + + def serialize_node(self, node, parent, index): + alias = self.anchors[node] + if node in self.serialized_nodes: + self.emit(AliasEvent(alias)) + else: + self.serialized_nodes[node] = True + self.descend_resolver(parent, index) + if isinstance(node, ScalarNode): + detected_tag = self.resolve(ScalarNode, node.value, (True, False)) + default_tag = self.resolve(ScalarNode, node.value, (False, True)) + implicit = (node.tag == detected_tag), (node.tag == default_tag) + self.emit(ScalarEvent(alias, node.tag, implicit, node.value, + style=node.style)) + elif isinstance(node, SequenceNode): + implicit = (node.tag + == self.resolve(SequenceNode, node.value, True)) + self.emit(SequenceStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + index = 0 + for item in node.value: + self.serialize_node(item, node, index) + index += 1 + self.emit(SequenceEndEvent()) + elif isinstance(node, MappingNode): + implicit = (node.tag + == self.resolve(MappingNode, node.value, True)) + self.emit(MappingStartEvent(alias, node.tag, implicit, + flow_style=node.flow_style)) + for key, value in node.value: + self.serialize_node(key, node, None) + self.serialize_node(value, node, key) + self.emit(MappingEndEvent()) + self.ascend_resolver() + diff --git a/python/pyyaml/lib3/yaml/tokens.py b/python/pyyaml/lib3/yaml/tokens.py new file mode 100644 index 000000000000..4d0b48a394ac --- /dev/null +++ b/python/pyyaml/lib3/yaml/tokens.py @@ -0,0 +1,104 @@ + +class Token(object): + def __init__(self, start_mark, end_mark): + self.start_mark = start_mark + self.end_mark = end_mark + def __repr__(self): + attributes = [key for key in self.__dict__ + if not key.endswith('_mark')] + attributes.sort() + arguments = ', '.join(['%s=%r' % (key, getattr(self, key)) + for key in attributes]) + return '%s(%s)' % (self.__class__.__name__, arguments) + +#class BOMToken(Token): +# id = '' + +class DirectiveToken(Token): + id = '' + def __init__(self, name, value, start_mark, end_mark): + self.name = name + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class DocumentStartToken(Token): + id = '' + +class DocumentEndToken(Token): + id = '' + +class StreamStartToken(Token): + id = '' + def __init__(self, start_mark=None, end_mark=None, + encoding=None): + self.start_mark = start_mark + self.end_mark = end_mark + self.encoding = encoding + +class StreamEndToken(Token): + id = '' + +class BlockSequenceStartToken(Token): + id = '' + +class BlockMappingStartToken(Token): + id = '' + +class BlockEndToken(Token): + id = '' + +class FlowSequenceStartToken(Token): + id = '[' + +class FlowMappingStartToken(Token): + id = '{' + +class FlowSequenceEndToken(Token): + id = ']' + +class FlowMappingEndToken(Token): + id = '}' + +class KeyToken(Token): + id = '?' + +class ValueToken(Token): + id = ':' + +class BlockEntryToken(Token): + id = '-' + +class FlowEntryToken(Token): + id = ',' + +class AliasToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class AnchorToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class TagToken(Token): + id = '' + def __init__(self, value, start_mark, end_mark): + self.value = value + self.start_mark = start_mark + self.end_mark = end_mark + +class ScalarToken(Token): + id = '' + def __init__(self, value, plain, start_mark, end_mark, style=None): + self.value = value + self.plain = plain + self.start_mark = start_mark + self.end_mark = end_mark + self.style = style + diff --git a/python/pyyaml/setup.cfg b/python/pyyaml/setup.cfg new file mode 100644 index 000000000000..d0239e45e50c --- /dev/null +++ b/python/pyyaml/setup.cfg @@ -0,0 +1,29 @@ + +# The INCLUDE and LIB directories to build the '_yaml' extension. +# You may also set them using the options '-I' and '-L'. +[build_ext] + +# List of directories to search for 'yaml.h' (separated by ':'). +#include_dirs=/usr/local/include:../../include + +# List of directories to search for 'libyaml.a' (separated by ':'). +#library_dirs=/usr/local/lib:../../lib + +# An alternative compiler to build the extention. +#compiler=mingw32 + +# Additional preprocessor definitions might be required. +#define=YAML_DECLARE_STATIC + +# The following options are used to build PyYAML Windows installer +# for Python 2.5 on my PC: +#include_dirs=../../../libyaml/tags/0.1.4/include +#library_dirs=../../../libyaml/tags/0.1.4/win32/vs2003/output/release/lib +#define=YAML_DECLARE_STATIC + +# The following options are used to build PyYAML Windows installer +# for Python 2.6, 2.7, 3.0, 3.1 and 3.2 on my PC: +#include_dirs=../../../libyaml/tags/0.1.4/include +#library_dirs=../../../libyaml/tags/0.1.4/win32/vs2008/output/release/lib +#define=YAML_DECLARE_STATIC + diff --git a/python/pyyaml/setup.py b/python/pyyaml/setup.py new file mode 100644 index 000000000000..727c3e06ea52 --- /dev/null +++ b/python/pyyaml/setup.py @@ -0,0 +1,345 @@ + +NAME = 'PyYAML' +VERSION = '3.11' +DESCRIPTION = "YAML parser and emitter for Python" +LONG_DESCRIPTION = """\ +YAML is a data serialization format designed for human readability +and interaction with scripting languages. PyYAML is a YAML parser +and emitter for Python. + +PyYAML features a complete YAML 1.1 parser, Unicode support, pickle +support, capable extension API, and sensible error messages. PyYAML +supports standard YAML tags and provides Python-specific tags that +allow to represent an arbitrary Python object. + +PyYAML is applicable for a broad range of tasks from complex +configuration files to object serialization and persistance.""" +AUTHOR = "Kirill Simonov" +AUTHOR_EMAIL = 'xi@resolvent.net' +LICENSE = "MIT" +PLATFORMS = "Any" +URL = "http://pyyaml.org/wiki/PyYAML" +DOWNLOAD_URL = "http://pyyaml.org/download/pyyaml/%s-%s.tar.gz" % (NAME, VERSION) +CLASSIFIERS = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.5", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.0", + "Programming Language :: Python :: 3.1", + "Programming Language :: Python :: 3.2", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Text Processing :: Markup", +] + + +LIBYAML_CHECK = """ +#include + +int main(void) { + yaml_parser_t parser; + yaml_emitter_t emitter; + + yaml_parser_initialize(&parser); + yaml_parser_delete(&parser); + + yaml_emitter_initialize(&emitter); + yaml_emitter_delete(&emitter); + + return 0; +} +""" + + +import sys, os.path + +from distutils import log +from distutils.core import setup, Command +from distutils.core import Distribution as _Distribution +from distutils.core import Extension as _Extension +from distutils.dir_util import mkpath +from distutils.command.build_ext import build_ext as _build_ext +from distutils.command.bdist_rpm import bdist_rpm as _bdist_rpm +from distutils.errors import CompileError, LinkError, DistutilsPlatformError + +if 'setuptools.extension' in sys.modules: + _Extension = sys.modules['setuptools.extension']._Extension + sys.modules['distutils.core'].Extension = _Extension + sys.modules['distutils.extension'].Extension = _Extension + sys.modules['distutils.command.build_ext'].Extension = _Extension + +with_pyrex = None +if sys.version_info[0] < 3: + try: + from Cython.Distutils.extension import Extension as _Extension + from Cython.Distutils import build_ext as _build_ext + with_pyrex = 'cython' + except ImportError: + try: + # Pyrex cannot build _yaml.c at the moment, + # but it may get fixed eventually. + from Pyrex.Distutils import Extension as _Extension + from Pyrex.Distutils import build_ext as _build_ext + with_pyrex = 'pyrex' + except ImportError: + pass + + +class Distribution(_Distribution): + + def __init__(self, attrs=None): + _Distribution.__init__(self, attrs) + if not self.ext_modules: + return + for idx in range(len(self.ext_modules)-1, -1, -1): + ext = self.ext_modules[idx] + if not isinstance(ext, Extension): + continue + setattr(self, ext.attr_name, None) + self.global_options = [ + (ext.option_name, None, + "include %s (default if %s is available)" + % (ext.feature_description, ext.feature_name)), + (ext.neg_option_name, None, + "exclude %s" % ext.feature_description), + ] + self.global_options + self.negative_opt = self.negative_opt.copy() + self.negative_opt[ext.neg_option_name] = ext.option_name + + def has_ext_modules(self): + if not self.ext_modules: + return False + for ext in self.ext_modules: + with_ext = self.ext_status(ext) + if with_ext is None or with_ext: + return True + return False + + def ext_status(self, ext): + if 'Java' in sys.version or 'IronPython' in sys.version or 'PyPy' in sys.version: + return False + if isinstance(ext, Extension): + with_ext = getattr(self, ext.attr_name) + return with_ext + else: + return True + + +class Extension(_Extension): + + def __init__(self, name, sources, feature_name, feature_description, + feature_check, **kwds): + if not with_pyrex: + for filename in sources[:]: + base, ext = os.path.splitext(filename) + if ext == '.pyx': + sources.remove(filename) + sources.append('%s.c' % base) + _Extension.__init__(self, name, sources, **kwds) + self.feature_name = feature_name + self.feature_description = feature_description + self.feature_check = feature_check + self.attr_name = 'with_' + feature_name.replace('-', '_') + self.option_name = 'with-' + feature_name + self.neg_option_name = 'without-' + feature_name + + +class build_ext(_build_ext): + + def run(self): + optional = True + disabled = True + for ext in self.extensions: + with_ext = self.distribution.ext_status(ext) + if with_ext is None: + disabled = False + elif with_ext: + optional = False + disabled = False + break + if disabled: + return + try: + _build_ext.run(self) + except DistutilsPlatformError: + exc = sys.exc_info()[1] + if optional: + log.warn(str(exc)) + log.warn("skipping build_ext") + else: + raise + + def get_source_files(self): + self.check_extensions_list(self.extensions) + filenames = [] + for ext in self.extensions: + if with_pyrex == 'pyrex': + self.pyrex_sources(ext.sources, ext) + elif with_pyrex == 'cython': + self.cython_sources(ext.sources, ext) + for filename in ext.sources: + filenames.append(filename) + base = os.path.splitext(filename)[0] + for ext in ['c', 'h', 'pyx', 'pxd']: + filename = '%s.%s' % (base, ext) + if filename not in filenames and os.path.isfile(filename): + filenames.append(filename) + return filenames + + def get_outputs(self): + self.check_extensions_list(self.extensions) + outputs = [] + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = os.path.join(self.build_lib, + self.get_ext_filename(fullname)) + if os.path.isfile(filename): + outputs.append(filename) + return outputs + + def build_extensions(self): + self.check_extensions_list(self.extensions) + for ext in self.extensions: + with_ext = self.distribution.ext_status(ext) + if with_ext is None: + with_ext = self.check_extension_availability(ext) + if not with_ext: + continue + if with_pyrex == 'pyrex': + ext.sources = self.pyrex_sources(ext.sources, ext) + elif with_pyrex == 'cython': + ext.sources = self.cython_sources(ext.sources, ext) + self.build_extension(ext) + + def check_extension_availability(self, ext): + cache = os.path.join(self.build_temp, 'check_%s.out' % ext.feature_name) + if not self.force and os.path.isfile(cache): + data = open(cache).read().strip() + if data == '1': + return True + elif data == '0': + return False + mkpath(self.build_temp) + src = os.path.join(self.build_temp, 'check_%s.c' % ext.feature_name) + open(src, 'w').write(ext.feature_check) + log.info("checking if %s is compilable" % ext.feature_name) + try: + [obj] = self.compiler.compile([src], + macros=ext.define_macros+[(undef,) for undef in ext.undef_macros], + include_dirs=ext.include_dirs, + extra_postargs=(ext.extra_compile_args or []), + depends=ext.depends) + except CompileError: + log.warn("") + log.warn("%s is not found or a compiler error: forcing --%s" + % (ext.feature_name, ext.neg_option_name)) + log.warn("(if %s is installed correctly, you may need to" + % ext.feature_name) + log.warn(" specify the option --include-dirs or uncomment and") + log.warn(" modify the parameter include_dirs in setup.cfg)") + open(cache, 'w').write('0\n') + return False + prog = 'check_%s' % ext.feature_name + log.info("checking if %s is linkable" % ext.feature_name) + try: + self.compiler.link_executable([obj], prog, + output_dir=self.build_temp, + libraries=ext.libraries, + library_dirs=ext.library_dirs, + runtime_library_dirs=ext.runtime_library_dirs, + extra_postargs=(ext.extra_link_args or [])) + except LinkError: + log.warn("") + log.warn("%s is not found or a linker error: forcing --%s" + % (ext.feature_name, ext.neg_option_name)) + log.warn("(if %s is installed correctly, you may need to" + % ext.feature_name) + log.warn(" specify the option --library-dirs or uncomment and") + log.warn(" modify the parameter library_dirs in setup.cfg)") + open(cache, 'w').write('0\n') + return False + open(cache, 'w').write('1\n') + return True + + +class bdist_rpm(_bdist_rpm): + + def _make_spec_file(self): + argv0 = sys.argv[0] + features = [] + for ext in self.distribution.ext_modules: + if not isinstance(ext, Extension): + continue + with_ext = getattr(self.distribution, ext.attr_name) + if with_ext is None: + continue + if with_ext: + features.append('--'+ext.option_name) + else: + features.append('--'+ext.neg_option_name) + sys.argv[0] = ' '.join([argv0]+features) + spec_file = _bdist_rpm._make_spec_file(self) + sys.argv[0] = argv0 + return spec_file + + +class test(Command): + + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + build_cmd = self.get_finalized_command('build') + build_cmd.run() + sys.path.insert(0, build_cmd.build_lib) + if sys.version_info[0] < 3: + sys.path.insert(0, 'tests/lib') + else: + sys.path.insert(0, 'tests/lib3') + import test_all + test_all.main([]) + + +if __name__ == '__main__': + + setup( + name=NAME, + version=VERSION, + description=DESCRIPTION, + long_description=LONG_DESCRIPTION, + author=AUTHOR, + author_email=AUTHOR_EMAIL, + license=LICENSE, + platforms=PLATFORMS, + url=URL, + download_url=DOWNLOAD_URL, + classifiers=CLASSIFIERS, + + package_dir={'': {2: 'lib', 3: 'lib3'}[sys.version_info[0]]}, + packages=['yaml'], + ext_modules=[ + Extension('_yaml', ['ext/_yaml.pyx'], + 'libyaml', "LibYAML bindings", LIBYAML_CHECK, + libraries=['yaml']), + ], + + distclass=Distribution, + + cmdclass={ + 'build_ext': build_ext, + 'bdist_rpm': bdist_rpm, + 'test': test, + }, + ) + diff --git a/security/pkix/test/gtest/pkixocsp_VerifyEncodedOCSPResponse.cpp b/security/pkix/test/gtest/pkixocsp_VerifyEncodedOCSPResponse.cpp index 39708d913947..c55e08dbb354 100644 --- a/security/pkix/test/gtest/pkixocsp_VerifyEncodedOCSPResponse.cpp +++ b/security/pkix/test/gtest/pkixocsp_VerifyEncodedOCSPResponse.cpp @@ -47,7 +47,7 @@ public: return Success; } - Result FindIssuer(Input, IssuerChecker&, Time) + Result FindIssuer(Input, IssuerChecker&, Time) final override { ADD_FAILURE(); return Result::FATAL_ERROR_LIBRARY_FAILURE; diff --git a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp index bd3e2f9da2f9..b295ae440b97 100644 --- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp +++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp @@ -172,7 +172,7 @@ SandboxBroker::SetSecurityLevelForGMPlugin() bool ret = (sandbox::SBOX_ALL_OK == result); result = mPolicy->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_RESTRICTED); + sandbox::USER_LOCKDOWN); ret = ret && (sandbox::SBOX_ALL_OK == result); result = mPolicy->SetAlternateDesktop(true); diff --git a/testing/config/mozharness/taskcluster_linux_config.py b/testing/config/mozharness/taskcluster_linux_config.py new file mode 100644 index 000000000000..0860181b4c22 --- /dev/null +++ b/testing/config/mozharness/taskcluster_linux_config.py @@ -0,0 +1,42 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +config = { + "reftest_options": [ + "--appname=%(binary_path)s", "--utility-path=tests/bin", + "--extra-profile-file=tests/bin/plugins", "--symbols-path=%(symbols_path)s" + ], + "mochitest_options": [ + "--appname=%(binary_path)s", "--utility-path=tests/bin", + "--extra-profile-file=tests/bin/plugins", "--symbols-path=%(symbols_path)s", + "--certificate-path=tests/certs", "--autorun", "--close-when-done", + "--console-level=INFO", "--setpref=webgl.force-enabled=true", + "--quiet", "--log-raw=%(raw_log_file)s" + ], + "webapprt_options": [ + "--app=%(app_path)s", "--utility-path=tests/bin", + "--extra-profile-file=tests/bin/plugins", "--symbols-path=%(symbols_path)s", + "--certificate-path=tests/certs", "--autorun", "--close-when-done", + "--console-level=INFO", "--testing-modules-dir=tests/modules", + "--quiet" + ], + "xpcshell_options": [ + "--symbols-path=%(symbols_path)s", + "--test-plugin-path=%(test_plugin_path)s" + ], + "cppunittest_options": [ + "--symbols-path=%(symbols_path)s", + "--xre-path=%(abs_app_dir)s" + ], + "jittest_options": [ + "tests/bin/js", + "--no-slow", + "--no-progress", + "--tinderbox", + "--tbpl" + ], + "mozbase_options": [ + "-b", "%(binary_path)s" + ], +} diff --git a/testing/docker/README.md b/testing/docker/README.md new file mode 100644 index 000000000000..b1bba4966604 --- /dev/null +++ b/testing/docker/README.md @@ -0,0 +1,57 @@ +# Docker Images for use in TaskCluster + +This folder contains various docker images used in [taskcluster](http://docs.taskcluster.net/) as well as other misc docker images which may be useful for +hacking on gecko. + +## Organization + +Each folder describes a single docker image. +These images depend on one another, as described in the `FROM` line at the top of the Dockerfile in each folder. +Each image has a version, given by its `VERSION` file. This should be bumped when any changes are made that will be deployed into taskcluster. +Then, older tasks which were designed to run on an older version of the image can still be executed in taskcluster, while new tasks can use the new version. + +Each image also has a `REGISTRY`, defaulting to the `REGISTRY` in this directory, and specifying the image registry to which the completed image should be uploaded. + +## Building images + +Generally images can be pulled from the [registry](./REGISTRY) rather then +build locally, but for developing new images its often helpful to hack on +them locally. + +To build an image, invoke `build.sh` with the name of the folder (without a trailing slash): +```sh +./build.sh base +``` + +This is a tiny wrapper around building the docker images via `docker +build -t $REGISTRY/$FOLDER:$FOLDER_VERSION` + +On completion, `build.sh` gives a command to upload the image to the registry, but this is not necessary until the image is ready for production usage. +Docker will successfully find the local, tagged image while you continue to hack on the image definitions. + +## Adding a new image + +The docker image primitives are very basic building block for +constructing an "image" but generally don't help much with tagging it +for deployment so we have a wrapper (./build.sh) which adds some sugar +to help with tagging/versioning... Each folder should look something +like this: + +``` + - your_amazing_image/ + - your_amazing_image/Dockerfile: Standard docker file syntax + - your_amazing_image/VERSION: The version of the docker file + (required* used during tagging) + - your_amazing_image/REGISTRY: Override default registry + (useful for secret registries) +``` + +## Conventions + +In some image folders you will see `.env` files these can be used in +conjunction with the `--env-file` flag in docker to provide a +environment with the given environment variables. These are primarily +for convenience when manually hacking on the images. + +You will also see a `system-setup.sh` script used to build the image. +Do not replicate this technique - prefer to include the commands and options directly in the Dockerfile. diff --git a/testing/docker/REGISTRY b/testing/docker/REGISTRY new file mode 100644 index 000000000000..bfdfbe252cfc --- /dev/null +++ b/testing/docker/REGISTRY @@ -0,0 +1 @@ +quay.io/mozilla diff --git a/testing/docker/b2g-build/Dockerfile b/testing/docker/b2g-build/Dockerfile new file mode 100644 index 000000000000..5d0948d330a3 --- /dev/null +++ b/testing/docker/b2g-build/Dockerfile @@ -0,0 +1,20 @@ +FROM quay.io/mozilla/base-build:0.0.1 +MAINTAINER Dustin J. Mitchell + +# Run system setup script; this ensures taht the whole process +# boils down to a single docker layer +ADD system-setup.sh /tmp/system-setup.sh +RUN ["/tmp/system-setup.sh"] + +# Set variable normally configured at login, by the shells parent process, these +# are taken from GNU su manual +ENV HOME /home/worker +ENV SHELL /bin/bash +ENV USER worker +ENV LOGNAME worker + +# Declare default working folder +WORKDIR /home/worker + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] diff --git a/testing/docker/b2g-build/VERSION b/testing/docker/b2g-build/VERSION new file mode 100644 index 000000000000..8acdd82b765e --- /dev/null +++ b/testing/docker/b2g-build/VERSION @@ -0,0 +1 @@ +0.0.1 diff --git a/testing/docker/b2g-build/system-setup.sh b/testing/docker/b2g-build/system-setup.sh new file mode 100755 index 000000000000..b434b68bcebc --- /dev/null +++ b/testing/docker/b2g-build/system-setup.sh @@ -0,0 +1,124 @@ +#!/bin/bash -ve + +################################### setup.sh ################################### + +### Check that we are running as root +test `whoami` == 'root'; + +yum install -y \ + alsa-lib-devel \ + autoconf213 \ + curl-devel \ + dbus-glib-devel \ + glibc-static \ + gstreamer-devel \ + gstreamer-plugins-base-devel \ + gtk2-devel \ + libstdc++-static \ + libXt-devel \ + mesa-libGL-devel \ + pulseaudio-libs-devel \ + wireless-tools-devel \ + yasm \ + dbus-python \ + ; + +yum install -y \ + libcurl-devel \ + openssl-devel \ + dbus-devel \ + dbus-glib-devel \ + GConf2-devel \ + iw \ + libnotify-devel \ + unzip \ + uuid \ + xorg-x11-server-Xvfb \ + xorg-x11-server-utils \ + tar \ + tcl \ + tk \ + unzip \ + zip \ + ; + +# From Building B2G docs +yum install -y \ + install \ + bison \ + bzip2 \ + ccache \ + curl \ + flex \ + gawk \ + gcc-c++ \ + glibc-devel \ + glibc-static \ + libstdc++-static \ + libX11-devel \ + make \ + ncurses-devel \ + patch \ + zlib-devel \ + ncurses-devel.i686 \ + readline-devel.i686 \ + zlib-devel.i686 \ + libX11-devel.i686 \ + mesa-libGL-devel.i686 \ + glibc-devel.i686 \ + libstdc++.i686 \ + libXrandr.i686 \ + perl-Digest-SHA \ + wget \ + ; + +# Install some utilities, we'll be using nodejs in automation scripts, maybe we +# shouldn't we can clean up later +yum install -y \ + screen \ + vim \ + nodejs \ + npm \ + ; + +# Install mozilla specific packages + +# puppetagain packages +base_url="http://mockbuild-repos.pub.build.mozilla.org/releng/public/CentOS/6/x86_64/" + +# Install Python 2.7, pip, and virtualenv (needed for things like mach) +rpm -ih $base_url/mozilla-python27-2.7.3-1.el6.x86_64.rpm +export PATH="/tools/python27-mercurial/bin:/tools/python27/bin:$PATH" +wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz +tar -xvf setuptools-1.4.2.tar.gz +cd setuptools-1.4.2 && python setup.py install +cd - && rm -rf setuptools-1.4.2* +curl https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py | python - +pip install virtualenv + +# Install more recent version of mercurial +rpm -ih $base_url/mozilla-python27-mercurial-3.1.2-1.el6.x86_64.rpm + +# Install more recent version of git and dependencies +yum install -y \ + perl-DBI \ + subversion-perl \ + ; +rpm -ih $base_url/mozilla-git-1.7.9.4-3.el6.x86_64.rpm + +# Install gcc to build gecko +rpm -ih $base_url/gcc473_0moz1-4.7.3-0moz1.x86_64.rpm + +### Generate machine uuid file +dbus-uuidgen --ensure=/var/lib/dbus/machine-id + +### Clean up from setup +# Remove cached packages. Cached package takes up a lot of space and +# distributing them to workers is wasteful. +yum clean all + +# Remove the setup.sh setup, we don't really need this script anymore, deleting +# it keeps the image as clean as possible. +rm $0; echo "Deleted $0"; + +################################### setup.sh ################################### diff --git a/testing/docker/base-build/Dockerfile b/testing/docker/base-build/Dockerfile new file mode 100644 index 000000000000..b5555cc948a1 --- /dev/null +++ b/testing/docker/base-build/Dockerfile @@ -0,0 +1,20 @@ +FROM centos:centos6 +MAINTAINER Jonas Finnemann Jensen + +# Run system setup script; this ensures taht the whole process +# boils down to a single docker layer +ADD system-setup.sh /tmp/system-setup.sh +RUN ["/tmp/system-setup.sh"] + +# Set variable normally configured at login, by the shells parent process, these +# are taken from GNU su manual +ENV HOME /home/worker +ENV SHELL /bin/bash +ENV USER worker +ENV LOGNAME worker + +# Declare default working folder +WORKDIR /home/worker + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] diff --git a/testing/docker/base-build/VERSION b/testing/docker/base-build/VERSION new file mode 100644 index 000000000000..4e379d2bfeab --- /dev/null +++ b/testing/docker/base-build/VERSION @@ -0,0 +1 @@ +0.0.2 diff --git a/testing/docker/base-build/system-setup.sh b/testing/docker/base-build/system-setup.sh new file mode 100755 index 000000000000..c47c59591413 --- /dev/null +++ b/testing/docker/base-build/system-setup.sh @@ -0,0 +1,46 @@ +#!/bin/bash -ve + +################################### setup.sh ################################### + +### Check that we are running as root +test `whoami` == 'root'; + +### Add worker user +# Minimize the number of things which the build script can do, security-wise +# it's not a problem to let the build script install things with yum. But it +# really shouldn't do this, so let's forbid root access. +useradd -d /home/worker -s /bin/bash -m worker; + +# Install extra package mirror +yum install -y epel-release + +### Install Useful Packages +# First we update and upgrade to latest versions. +yum update -y + +# Let's install some goodies, ca-certificates is needed for https with hg. +# sudo will be required anyway, but let's make it explicit. It nice to have +# sudo around. We'll also install nano, this is pure bloat I know, but it's +# useful a text editor. +yum install -y \ + ca-certificates \ + sudo \ + nano \ + ; + +# Then let's install all firefox build dependencies, these are extracted from +# mozboot. See python/mozboot/bin/bootstrap.py in mozilla-central. +yum groupinstall -y \ + "Development Tools" \ + "Development Libraries" \ + "GNOME Software Development" + +### Clean up from setup +# Remove cached packages. Cached package takes up a lot of space and +# distributing them to workers is wasteful. +yum clean all + +# Remove the setup.sh setup, we don't really need this script anymore, deleting +# it keeps the image as clean as possible. +rm $0; echo "Deleted $0"; + diff --git a/testing/docker/base-test/Dockerfile b/testing/docker/base-test/Dockerfile new file mode 100644 index 000000000000..3b73ea452669 --- /dev/null +++ b/testing/docker/base-test/Dockerfile @@ -0,0 +1,19 @@ +FROM quay.io/mozilla/ubuntu:12.04 +MAINTAINER Jonas Finnemann Jensen + +# Run system setup script +ADD system-setup.sh /tmp/system-setup.sh +RUN ["/tmp/system-setup.sh"] + +# Set variable normally configured at login, by the shells parent process, these +# are taken from GNU su manual +ENV HOME /home/worker +ENV SHELL /bin/bash +ENV USER worker +ENV LOGNAME worker + +# Declare default working folder +WORKDIR /home/worker + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] diff --git a/testing/docker/base-test/VERSION b/testing/docker/base-test/VERSION new file mode 100644 index 000000000000..8acdd82b765e --- /dev/null +++ b/testing/docker/base-test/VERSION @@ -0,0 +1 @@ +0.0.1 diff --git a/testing/docker/base-test/system-setup.sh b/testing/docker/base-test/system-setup.sh new file mode 100755 index 000000000000..a5e15586e20a --- /dev/null +++ b/testing/docker/base-test/system-setup.sh @@ -0,0 +1,149 @@ +#!/bin/bash -ve + +################################### setup.sh ################################### + +### Check that we are running as root +test `whoami` == 'root'; + +### Add worker user +# Minimize the number of things which the build script can do, security-wise +# it's not a problem to let the build script install things with apt-get. But it +# really shouldn't do this, so let's forbid root access. +useradd -d /home/worker -s /bin/bash -m worker; + +### Install Useful Packages +# First we update and upgrade to latest versions. +apt-get update; +apt-get upgrade -y; + +# Let's install some goodies, ca-certificates is needed for https with hg. +# sudo will be required anyway, but let's make it explicit. It nice to have +# sudo around. We'll also install nano, this is pure bloat I know, but it's +# useful a text editor. +apt-get install -y \ + ca-certificates \ + sudo \ + nano \ + tar \ + ; + +# Then let's install all firefox build dependencies, this are extracted from +# mozboot. See python/mozboot/bin/bootstrap.py in mozilla-central. +apt-get install -y \ + autoconf2.13 \ + build-essential \ + ccache \ + libasound2-dev \ + libcurl4-openssl-dev \ + libdbus-1-dev \ + libdbus-glib-1-dev \ + libgconf2-dev \ + libgstreamer0.10-dev \ + libgstreamer-plugins-base0.10-dev \ + libgtk2.0-dev \ + libiw-dev \ + libnotify-dev \ + libpulse-dev \ + libxt-dev \ + mercurial \ + git \ + mesa-common-dev \ + python-dev \ + unzip \ + uuid \ + yasm \ + xvfb \ + zip \ + software-properties-common \ + ; + +### Firefox Test Setup +apt-get install -y \ + alsa-base \ + alsa-utils \ + bluez-alsa \ + bluez-alsa:i386 \ + bluez-cups \ + bluez-gstreamer \ + g++-multilib \ + gcc-multilib \ + gir1.2-gnomebluetooth-1.0 \ + gstreamer0.10-alsa \ + libasound2-plugins:i386 \ + libcanberra-pulse \ + libdrm-intel1:i386 \ + libdrm-nouveau1a:i386 \ + libdrm-radeon1:i386 \ + libdrm2:i386 \ + libexpat1:i386 \ + libgnome-bluetooth8 \ + libllvm2.9 \ + libllvm3.0:i386 \ + libncurses5:i386 \ + libpulse-mainloop-glib0:i386 \ + libpulsedsp:i386 \ + libsdl1.2debian:i386 \ + libsox-fmt-alsa \ + libx11-xcb1:i386 \ + libxcb-glx0:i386 \ + libxcb-glx0 \ + libxdamage1:i386 \ + libxfixes3:i386 \ + libxxf86vm1:i386 \ + libxxf86vm1 \ + llvm \ + llvm-2.9 \ + llvm-2.9-dev \ + llvm-2.9-runtime \ + llvm-dev \ + llvm-runtime \ + pulseaudio-module-bluetooth \ + pulseaudio-module-gconf \ + pulseaudio-module-X11 \ + pulseaudio \ + python-pip + +# Install some utilities +curl -sL https://deb.nodesource.com/setup | sudo bash - +apt-get install -y \ + screen \ + vim \ + wget \ + curl \ + rlwrap \ + nodejs \ + ; + +# Mozilla-patched mesa libs required for many reftests -- see bug 975034 +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libgl1-mesa-dri_8.0.4-0ubuntu0.6mozilla1_i386.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libgl1-mesa-dri_8.0.4-0ubuntu0.6mozilla1_amd64.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libgl1-mesa-glx_8.0.4-0ubuntu0.6mozilla1_i386.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libgl1-mesa-glx_8.0.4-0ubuntu0.6mozilla1_amd64.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libglapi-mesa_8.0.4-0ubuntu0.6mozilla1_i386.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libglapi-mesa_8.0.4-0ubuntu0.6mozilla1_amd64.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libglu1-mesa_8.0.4-0ubuntu0.6mozilla1_i386.deb +wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/pool/main/m/mesa/libglu1-mesa_8.0.4-0ubuntu0.6mozilla1_amd64.deb +dpkg -i libgl1-mesa-dri_8.0.4-0ubuntu0.6mozilla1_amd64.deb +dpkg -i libgl1-mesa-dri_8.0.4-0ubuntu0.6mozilla1_i386.deb +dpkg -i libglapi-mesa_8.0.4-0ubuntu0.6mozilla1_amd64.deb +dpkg -i libglapi-mesa_8.0.4-0ubuntu0.6mozilla1_i386.deb +dpkg -i libgl1-mesa-glx_8.0.4-0ubuntu0.6mozilla1_i386.deb +dpkg -i libgl1-mesa-glx_8.0.4-0ubuntu0.6mozilla1_amd64.deb +dpkg -i libglu1-mesa_8.0.4-0ubuntu0.6mozilla1_i386.deb +dpkg -i libglu1-mesa_8.0.4-0ubuntu0.6mozilla1_amd64.deb + +# Install releng package of nodejs that includes npm +#wget http://puppetagain.pub.build.mozilla.org/data/repos/apt/releng/precise/pool/main/n/nodejs/nodejs_0.10.21-1chl1~precise1_amd64.deb +#dpkg -i nodejs_0.10.21-1chl1~precise1_amd64.deb + +### Clean up from setup +# Remove cached .deb packages. Cached package takes up a lot of space and +# distributing them to workers is wasteful. +apt-get clean +rm *.deb + +# Remove the setup.sh setup, we don't really need this script anymore, deleting +# it keeps the image as clean as possible. +rm $0; echo "Deleted $0"; + +################################### setup.sh ################################### diff --git a/testing/docker/build.sh b/testing/docker/build.sh new file mode 100755 index 000000000000..851e64cee672 --- /dev/null +++ b/testing/docker/build.sh @@ -0,0 +1,90 @@ +#! /bin/bash -e + +# This file is a wrapper around docker build with specific concerns around image +# versions and registry deployment... It also attempts to detect any potential +# missing dependencies and warns you about them. + +usage() { + echo "Build a docker image in the given folder (and tag it)" + echo + echo "$0 " + echo + echo " For more see: $PWD/README.md" + echo +} + +usage_err() { + echo $1 + echo + usage + exit 1 +} + +find_registry() { + local reg="$1/REGISTRY" + + if [ -f $reg ]; + then + echo $folder + return + fi +} + +build() { + local folder=$1 + local folder_reg="$1/REGISTRY" + local folder_ver="$1/VERSION" + + if [ "$folder" == "" ]; + then + usage + return + fi + + test -d "$folder" || usage_err "Unknown folder: $folder" + test -f "$folder_ver" || usage_err "$folder must contain VERSION file" + + # Fallback to default registry if one is not in the folder... + if [ ! -f "$folder_reg" ]; then + folder_reg=$PWD/REGISTRY + fi + + local registry=$(cat $folder_reg) + local version=$(cat $folder_ver) + + test -n "$registry" || usage_err "$folder_reg is empty aborting..." + test -n "$version" || usage_err "$folder_ver is empty aborting..." + + local tag="$registry/$folder:$version" + + if [ -f $folder/build.sh ]; then + shift + $folder/build.sh -t $tag $* + else + # use --no-cache so that we always get the latest updates from yum + # and use the latest version of system-setup.sh + docker build --no-cache -t $tag $folder + fi + + echo "Success built $folder and tagged with $tag" + echo "If deploying now you can run 'docker push $tag'" +} + +if ! which docker > /dev/null; then + echo "Docker must be installed read installation instructions at docker.com" + echo + usage + exit 1 +fi + +# TODO: In the future we should check minimum docker version it does matter. +if ! docker version > /dev/null; +then + echo "Docker server is unresponsive run 'docker ps' and check that docker is" + echo "running" + echo + usage + exit 1 +fi + +build $* diff --git a/testing/docker/builder/Dockerfile b/testing/docker/builder/Dockerfile new file mode 100644 index 000000000000..fecadd369de9 --- /dev/null +++ b/testing/docker/builder/Dockerfile @@ -0,0 +1,38 @@ +FROM quay.io/mozilla/b2g-build:0.0.1 +MAINTAINER Dustin J. Mitchell + +ENV PATH /tools/python27-mercurial/bin:/tools/python27/bin:/tools/tools/buildfarm/utils:$PATH:/home/worker/bin/ +ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH + +ENV TOOLTOOL_CACHE /home/worker/tools/tooltool-cache + +# Add utilities and configuration +RUN mkdir -p /home/worker/bin /home/worker/tools +RUN chown -R worker:worker /home/worker/* /home/worker/.* + +# Install android repo tool +RUN curl https://storage.googleapis.com/git-repo-downloads/repo > /home/worker/bin/repo +RUN chmod a+x /home/worker/bin/repo + +# Instal build tools +RUN hg clone http://hg.mozilla.org/build/tools/ /tools/tools && \ + cd /tools/tools && \ + python setup.py install + + +# Initialize git (makes repo happy) +RUN git config --global user.email "docker@docker.com" && \ + git config --global user.name "docker" + +# VCS Tools +RUN npm install -g taskcluster-vcs@0.0.2 + +# Add bin tools last as they are most likely to change +ADD bin /home/worker/bin + +# TODO enable worker +# TODO volume mount permissions will be an issue +# USER worker + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] diff --git a/testing/docker/builder/VERSION b/testing/docker/builder/VERSION new file mode 100644 index 000000000000..f092e2be2a89 --- /dev/null +++ b/testing/docker/builder/VERSION @@ -0,0 +1 @@ +0.0.30 diff --git a/testing/docker/builder/bin/build-b2g-desktop.sh b/testing/docker/builder/bin/build-b2g-desktop.sh new file mode 100755 index 000000000000..7ef8561b5c69 --- /dev/null +++ b/testing/docker/builder/bin/build-b2g-desktop.sh @@ -0,0 +1,52 @@ +#!/bin/bash -live + +################################### build.sh ################################### + +. build-setup.sh + +### Check that require variables are defined +test $MOZCONFIG + +# Ensure gecko is at the correct revision +pull-gecko.sh $gecko_dir + +### Install package dependencies +install-packages.sh $gecko_dir + +### Clone gaia +pull-gaia.sh $gecko_dir $gaia_dir + +cd $gecko_dir + +# Nightly mozconfig expects gaia repo be inside mozilla-central tree +if [ ! -d "gaia" ]; then + ln -s $gaia_dir gaia +fi + +export MOZ_OBJDIR=$(get-objdir.py $gecko_dir) + +./mach build; + +### Make package +cd $MOZ_OBJDIR +make package package-tests; + +### Extract artifacts +# Navigate to dist/ folder +cd $MOZ_OBJDIR/dist + +ls -lah $MOZ_OBJDIR/dist/ + +# Target names are cached so make sure we discard them first if found. +rm -f target.linux-x86_64.tar.bz2 target.linux-x86_64.json target.tests.zip + +# Artifacts folder is outside of the cache. +mkdir -p /home/worker/artifacts/ + +# Discard version numbers from packaged files, they just make it hard to write +# the right filename in the task payload where artifacts are declared +mv *.linux-x86_64.tar.bz2 /home/worker/artifacts/target.linux-x86_64.tar.bz2 +mv *.linux-x86_64.json /home/worker/artifacts/target.linux-x86_64.json +mv *.tests.zip /home/worker/artifacts/target.tests.zip + +################################### build.sh ################################### diff --git a/testing/docker/builder/bin/build-emulator.sh b/testing/docker/builder/bin/build-emulator.sh new file mode 100755 index 000000000000..fc7b940e4ff8 --- /dev/null +++ b/testing/docker/builder/bin/build-emulator.sh @@ -0,0 +1,54 @@ +#! /bin/bash -vex + +### Check that require variables are defined +test $GECKO_HEAD_REPOSITORY # Should be an hg repository url to pull from +test $GECKO_BASE_REPOSITORY # Should be an hg repository url to clone from +test $GECKO_HEAD_REV # Should be an hg revision to pull down +test $MOZHARNESS_REPOSITORY # mozharness repository +test $MOZHARNESS_REV # mozharness revision +test $TARGET + +# First check if the mozharness directory is available. This is intended to be +# used locally in development to test mozharness changes: +# +# $ docker -v your_mozharness:/home/worker/mozharness ... +# +if [ ! -d mozharness ]; then + tc-vcs clone $MOZHARNESS_REPOSITORY -u $MOZHARNESS_REV mozharness +fi + +OBJDIR="$HOME/object-folder" + +if [ ! -d $OBJDIR ]; then + mkdir -p $OBJDIR +fi + +if [ ! -d $OBJDIR/B2G ]; then + tc-vcs clone https://git.mozilla.org/b2g/B2G.git $OBJDIR/B2G +fi + +debug_flag="" +if [ 0$B2G_DEBUG -ne 0 ]; then + debug_flag='--debug' +fi + +./mozharness/scripts/b2g_build.py \ + --config b2g/taskcluster-emulator.py \ + "$debug_flag" \ + --disable-mock \ + --work-dir=$OBJDIR/B2G \ + --log-level=debug \ + --target=$TARGET \ + --b2g-config-dir=$TARGET \ + --checkout-revision=$GECKO_HEAD_REV \ + --base-repo=$GECKO_BASE_REPOSITORY \ + --repo=$GECKO_HEAD_REPOSITORY + +# Move files into artifact locations! +mkdir -p artifacts + +mv $OBJDIR/B2G/sources.xml artifacts/sources.xml +mv $OBJDIR/B2G/out/target/product/generic/tests/gaia-tests.zip artifacts/gaia-tests.zip +mv $OBJDIR/B2G/out/target/product/generic/tests/b2g-*.zip artifacts/b2g-tests.zip +mv $OBJDIR/B2G/out/emulator.tar.gz artifacts/emulator.tar.gz +mv $OBJDIR/B2G/objdir-gecko/dist/b2g-*.crashreporter-symbols.zip artifacts/b2g-crashreporter-symbols.zip diff --git a/testing/docker/builder/bin/build-mulet-linux.sh b/testing/docker/builder/bin/build-mulet-linux.sh new file mode 100755 index 000000000000..1659bbe82333 --- /dev/null +++ b/testing/docker/builder/bin/build-mulet-linux.sh @@ -0,0 +1,45 @@ +#!/bin/bash -live + +################################### build-mulet-linux.sh ################################### + +. build-setup.sh + +### Check that require variables are defined +test $MOZCONFIG + +# Ensure gecko is at the correct revision +pull-gecko.sh $gecko_dir + +### Install package dependencies +install-packages.sh $gecko_dir + +export MOZ_OBJDIR=$(get-objdir.py $gecko_dir) + +cd $gecko_dir +./mach build; + +### Make package +cd $MOZ_OBJDIR; +make package package-tests; + +### Extract artifacts +# Navigate to dist/ folder +cd $MOZ_OBJDIR/dist; + +ls -lah $MOZ_OBJDIR/dist/ + + +# Target names are cached so make sure we discard them first if found. +rm -f target.linux-x86_64.tar.bz2 target.linux-x86_64.json target.tests.zip + +# Artifacts folder is outside of the cache. +mkdir -p /home/worker/artifacts/ + +# Discard version numbers from packaged files, they just make it hard to write +# the right filename in the task payload where artifacts are declared +mv *.linux-x86_64.tar.bz2 /home/worker/artifacts/target.linux-x86_64.tar.bz2 +mv *.linux-x86_64.json /home/worker/artifacts/target.linux-x86_64.json +mv *.tests.zip /home/worker/artifacts/target.tests.zip +mv jsshell-linux-x86_64.zip /home/worker/artifacts/jsshell-linux-x86_64.zip + +################################### build.sh ################################### diff --git a/testing/docker/builder/bin/build-setup.sh b/testing/docker/builder/bin/build-setup.sh new file mode 100755 index 000000000000..c5a6a96f8b22 --- /dev/null +++ b/testing/docker/builder/bin/build-setup.sh @@ -0,0 +1,20 @@ +#!/bin/bash -vex + +gecko_dir=/home/worker/gecko/source +gaia_dir=/home/worker/gaia/source + +create_parent_dir() { + parent_dir=$(dirname $1) + if [ ! -d "$parent_dir" ]; then + mkdir -p "$parent_dir" + fi +} + +# Ensure we always have the parent directory for gecko +create_parent_dir $gecko_dir + +# Create .mozbuild so mach doesn't complain about this +mkdir -p /home/worker/.mozbuild/ + +# Create object-folder exists +mkdir -p /home/worker/object-folder/ diff --git a/testing/docker/builder/bin/build.sh b/testing/docker/builder/bin/build.sh new file mode 100755 index 000000000000..137be0aece88 --- /dev/null +++ b/testing/docker/builder/bin/build.sh @@ -0,0 +1,35 @@ +#!/bin/bash -live + +################################### build.sh ################################### + +build-setup.sh + +### Check that we are running as worker +test `whoami` == 'worker'; + +### Check that require variables are defined +test $REPOSITORY # Should be an hg repository url to pull from +test $REVISION # Should be an hg revision to pull down +test $MOZCONFIG # Should be a mozconfig file from mozconfig/ folder + +### Pull, Update and Build +cd /home/worker/mozilla-central; +hg pull -r $REVISION $REPOSITORY; +hg update $REVISION; +./mach build; + +### Make package +cd /home/worker/object-folder; +make package package-tests; + +### Extract artifacts +# Navigate to dist/ folder +cd /home/worker/object-folder/dist; +# Discard version numbers from packaged files, they just make it hard to write +# the right filename in the task payload where artifacts are declared +mv *.linux-x86_64.tar.bz2 target.linux-x86_64.tar.bz2 +mv *.linux-x86_64.json target.linux-x86_64.json +mv *.tests.zip target.tests.zip + + +################################### build.sh ################################### diff --git a/testing/docker/builder/bin/gaia_props.py b/testing/docker/builder/bin/gaia_props.py new file mode 100755 index 000000000000..63d54059fe12 --- /dev/null +++ b/testing/docker/builder/bin/gaia_props.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python + +''' +Command line interface to fetch details from the b2g/config/gaia.json properties +file used to link a particular version of gaia to gecko. +''' + +import argparse +import os +import json +import sys +import urlparse + +parser = argparse.ArgumentParser( + description='Get various information about gaia version tied to particular \ + gecko') + +parser.add_argument('gecko', metavar="GECKO_DIR", help="Path to gecko revision") +parser.add_argument('prop', help="Property type", + choices=['repository', 'revision']) + +args = parser.parse_args() + +if not os.path.isdir(args.gecko): + print >> sys.stderr, 'Given gecko path is not a directory' + sys.exit(1) + +props_path = os.path.join(args.gecko, 'b2g/config/gaia.json') + +if not os.path.isfile(props_path): + print >> sys.stderr, \ + 'Gecko directory does not contain b2g/config/gaia.json' + sys.exit(1) + +props = json.load(open(props_path)) + +if args.prop == 'revision': + print(props['revision']); + +if args.prop == 'repository': + print(urlparse.urljoin('https://hg.mozilla.org', props['repo_path'])) diff --git a/testing/docker/builder/bin/get-objdir.py b/testing/docker/builder/bin/get-objdir.py new file mode 100755 index 000000000000..9854995b0876 --- /dev/null +++ b/testing/docker/builder/bin/get-objdir.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +from __future__ import print_function +import sys +import os +import json +import subprocess +from StringIO import StringIO + +DEFAULT_OBJDIR = "/home/worker/object-folder" + +gecko_dir = sys.argv[1] +os.chdir(gecko_dir) + +result = subprocess.check_output(["./mach", "environment", "--format", "json"]) +environment = json.load(StringIO(result)) + +topobjdir = environment["mozconfig"]["topobjdir"] +if topobjdir is None: + topobjdir = DEFAULT_OBJDIR + +print(topobjdir) diff --git a/testing/docker/builder/bin/install-packages.sh b/testing/docker/builder/bin/install-packages.sh new file mode 100755 index 000000000000..4dc24be924bb --- /dev/null +++ b/testing/docker/builder/bin/install-packages.sh @@ -0,0 +1,33 @@ +#!/bin/bash -vex + +gecko_dir=$1 +test -d $gecko_dir + +if [ ! -d "$gecko_dir/gcc" ]; then + cd $gecko_dir + curl https://s3-us-west-2.amazonaws.com/test-caching/packages/gcc.tar.xz | tar Jx + cd - +fi + +if [ ! -d "$gecko_dir/sccache" ]; then + cd $gecko_dir + curl https://s3-us-west-2.amazonaws.com/test-caching/packages/sccache.tar.bz2 | tar jx + cd - +fi + +# Remove cached moztt directory if it exists when a user supplied a git url/revision +if [ ! -z $MOZTT_GIT_URL ] || [ ! -z $MOZTT_REVISION ]; then + echo "Removing cached moztt package" + rm -rf moztt +fi + +if [ ! -d "$gecko_dir/moztt" ]; then + moztt_url=${MOZTT_GIT_URL:=https://github.com/mozilla-b2g/moztt} + moztt_revision=${MOZTT_REVISION:=master} + tc-vcs clone $moztt_url $gecko_dir/moztt + tc-vcs checkout-revision \ + $gecko_dir/moztt $moztt_url $moztt_revision $moztt_revision + echo "moztt repository: $moztt_url" + echo "moztt revision: $(tc-vcs revision $gecko_dir/moztt)" +fi + diff --git a/testing/docker/builder/bin/pull-gaia.sh b/testing/docker/builder/bin/pull-gaia.sh new file mode 100755 index 000000000000..a4b7efec0e13 --- /dev/null +++ b/testing/docker/builder/bin/pull-gaia.sh @@ -0,0 +1,23 @@ +#! /bin/bash -e + +gecko_dir=$1 +target=$2 + +gaia_repo=$(gaia_props.py $gecko_dir repository) +gaia_rev=$(gaia_props.py $gecko_dir revision) + +# Initial clone +if [ ! -d "$target" ]; then + echo "Running Initial gaia clone" + mkdir -p $(dirname $target) + tc-vcs clone $gaia_repo $target +fi + +echo "Checking out gaia $gaia_repo $gaia_rev" +tc-vcs checkout-revision \ + $target \ + $gaia_repo \ + $gaia_rev \ + $gaia_rev + + diff --git a/testing/docker/builder/bin/pull-gecko.sh b/testing/docker/builder/bin/pull-gecko.sh new file mode 100755 index 000000000000..cb99aa4db5bc --- /dev/null +++ b/testing/docker/builder/bin/pull-gecko.sh @@ -0,0 +1,21 @@ +#! /bin/bash -e + +target=$1 + +test $GECKO_BASE_REPOSITORY # base repository +test $GECKO_HEAD_REPOSITORY # repository to pull from +test $GECKO_HEAD_REF # reference if needed (usually same as rev) +test $GECKO_HEAD_REV # revision to checkout after pull + +if [ ! -d $target ]; +then + echo 'Running initial clone of gecko...' + tc-vcs clone $GECKO_BASE_REPOSITORY $target +fi + +echo "Updating $target to $GECKO_HEAD_REPOSITORY $GECKO_HEAD_REF $GECKO_HEAD_REV" +tc-vcs checkout-revision \ + $target \ + $GECKO_HEAD_REPOSITORY \ + $GECKO_HEAD_REF \ + $GECKO_HEAD_REV diff --git a/testing/docker/builder/emulator.env b/testing/docker/builder/emulator.env new file mode 100644 index 000000000000..944a41c73bdc --- /dev/null +++ b/testing/docker/builder/emulator.env @@ -0,0 +1,4 @@ +GECKO_HEAD_REPOSITORY=https://hg.mozilla.org/mozilla-central +GECKO_HEAD_REV=tip +TARGET=emulator +B2G_CONFIG=emulator-ics diff --git a/testing/docker/builder/git.env b/testing/docker/builder/git.env new file mode 100644 index 000000000000..4ebd746d3188 --- /dev/null +++ b/testing/docker/builder/git.env @@ -0,0 +1,5 @@ +GECKO_BASE_REPOSITORY=https://github.com/mozilla/gecko-dev +GECKO_HEAD_REPOSITORY=https://github.com/mozilla/gecko-dev +GECKO_HEAD_REF=master +GECKO_HEAD_REV=master +MOZCONFIG=/home/worker/gecko/source/b2g/config/mozconfigs/linux64_gecko/nightly diff --git a/testing/docker/builder/hg.env b/testing/docker/builder/hg.env new file mode 100644 index 000000000000..107e2b3f71d0 --- /dev/null +++ b/testing/docker/builder/hg.env @@ -0,0 +1,5 @@ +GECKO_BASE_REPOSITORY=https://hg.mozilla.org/mozilla-central +GECKO_HEAD_REPOSITORY=https://hg.mozilla.org/mozilla-central +GECKO_HEAD_REF=tip +GECKO_HEAD_REV=tip +MOZCONFIG=/home/worker/gecko/source/b2g/config/mozconfigs/linux64_gecko/nightly diff --git a/testing/docker/decision/Dockerfile b/testing/docker/decision/Dockerfile new file mode 100644 index 000000000000..178d8841bb30 --- /dev/null +++ b/testing/docker/decision/Dockerfile @@ -0,0 +1,8 @@ +FROM quay.io/mozilla/base-build:0.0.1 +MAINTAINER Jonas Finnemann Jensen + +ENV PATH /home/worker/bin/:$PATH + +# Add utilities and configuration +RUN npm install -g taskcluster-vcs@0.0.2 +ADD bin /home/worker/bin diff --git a/testing/docker/decision/README.md b/testing/docker/decision/README.md new file mode 100644 index 000000000000..4490880be89b --- /dev/null +++ b/testing/docker/decision/README.md @@ -0,0 +1,5 @@ +# Decision Tasks + +The decision image is a "boostrapping" image for the in tree logic it +deals with cloning gecko and the related utilities for providing an +environment where we can run gecko. diff --git a/testing/docker/decision/VERSION b/testing/docker/decision/VERSION new file mode 100644 index 000000000000..bcab45af15a0 --- /dev/null +++ b/testing/docker/decision/VERSION @@ -0,0 +1 @@ +0.0.3 diff --git a/testing/docker/decision/bin/entrypoint b/testing/docker/decision/bin/entrypoint new file mode 100755 index 000000000000..47e58cc78919 --- /dev/null +++ b/testing/docker/decision/bin/entrypoint @@ -0,0 +1,24 @@ +#! /bin/bash -ex + +DEST=/home/worker/source/gecko + +test $GECKO_BASE_REPOSITORY +test $GECKO_HEAD_REPOSITORY +test $GECKO_HEAD_REF +test $GECKO_HEAD_REV + +mkdir -p $(dirname $DEST) + +if [ ! -d $DEST ]; +then + tc-vcs clone $GECKO_BASE_REPOSITORY $DEST +fi + +tc-vcs checkout-revision \ + $DEST \ + $GECKO_HEAD_REPOSITORY \ + $GECKO_HEAD_REV \ + $GECKO_HEAD_REF + +echo "At revision: $(tc-vcs revision $DEST)" +cd $DEST diff --git a/testing/docker/decision/git.env b/testing/docker/decision/git.env new file mode 100644 index 000000000000..82340d5e98dd --- /dev/null +++ b/testing/docker/decision/git.env @@ -0,0 +1,4 @@ +GECKO_BASE_REPOSITORY=https://github.com/mozilla/gecko-dev +GECKO_HEAD_REPOSITORY=https://github.com/mozilla/gecko-dev +GECKO_HEAD_REF=master +GECKO_HEAD_REV=master diff --git a/testing/docker/phone-builder/Dockerfile b/testing/docker/phone-builder/Dockerfile new file mode 100644 index 000000000000..68286a730706 --- /dev/null +++ b/testing/docker/phone-builder/Dockerfile @@ -0,0 +1,13 @@ +FROM quay.io/mozilla/builder:0.0.29 +MAINTAINER Wander Lairson Costa + +# Add utilities and configuration +ADD bin /home/worker/bin +ADD config /home/worker/.aws/config +ADD system-setup.sh /tmp/system-setup.sh + +RUN /tmp/system-setup.sh + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] + diff --git a/testing/docker/phone-builder/VERSION b/testing/docker/phone-builder/VERSION new file mode 100644 index 000000000000..5a5831ab6bf6 --- /dev/null +++ b/testing/docker/phone-builder/VERSION @@ -0,0 +1 @@ +0.0.7 diff --git a/testing/docker/phone-builder/bin/build-phone.sh b/testing/docker/phone-builder/bin/build-phone.sh new file mode 100755 index 000000000000..bef7e0cf089a --- /dev/null +++ b/testing/docker/phone-builder/bin/build-phone.sh @@ -0,0 +1,73 @@ +#! /bin/bash -vex + +### Check that require variables are defined +test $GECKO_HEAD_REPOSITORY # Should be an hg repository url to pull from +test $GECKO_BASE_REPOSITORY # Should be an hg repository url to clone from +test $GECKO_HEAD_REV # Should be an hg revision to pull down +test $MOZHARNESS_REPOSITORY # mozharness repository +test $MOZHARNESS_REV # mozharness revision +test $TARGET +test $VARIANT + +if ! validate_task.py; then + echo "Not a valid task" >&2 + exit 1 +fi + +# First check if the mozharness directory is available. This is intended to be +# used locally in development to test mozharness changes: +# +# $ docker -v your_mozharness:/home/worker/mozharness ... +# +if [ ! -d mozharness ]; then + tc-vcs clone $MOZHARNESS_REPOSITORY -u $MOZHARNESS_REV mozharness +fi + +OBJDIR="$HOME/object-folder" + +if [ ! -d $OBJDIR ]; then + mkdir -p $OBJDIR +fi + +if [ ! -d $OBJDIR/B2G ]; then + tc-vcs clone https://git.mozilla.org/b2g/B2G.git $OBJDIR/B2G +fi + +debug_flag="" +if [ 0$B2G_DEBUG -ne 0 ]; then + debug_flag='--debug' +fi + +backup_file=$(aws --output=text s3 ls s3://b2g-phone-backups/$TARGET/ | tail -1 | awk '{print $NF}') + +if echo $backup_file | grep '\.tar\.bz2'; then + aws s3 cp s3://b2g-phone-backups/$TARGET/$backup_file . + tar -xjf $backup_file -C $OBJDIR/B2G + rm -f $backup_file +fi + +./mozharness/scripts/b2g_build.py \ + --config b2g/taskcluster-phone.py \ + "$debug_flag" \ + --disable-mock \ + --variant=$VARIANT \ + --work-dir=$OBJDIR/B2G \ + --gaia-languages-file locales/languages_all.json \ + --log-level=debug \ + --target=$TARGET \ + --b2g-config-dir=$TARGET \ + --checkout-revision=$GECKO_HEAD_REV \ + --base-repo=$GECKO_BASE_REPOSITORY \ + --repo=$GECKO_HEAD_REPOSITORY + +# Don't cache backups +rm -rf $OBJDIR/B2G/backup-* + +# Move files into artifact locations! +mkdir -p artifacts + +mv $OBJDIR/B2G/upload/sources.xml artifacts/sources.xml +mv $OBJDIR/B2G/upload/b2g-*.crashreporter-symbols.zip artifacts/b2g-crashreporter-symbols.zip +mv $OBJDIR/B2G/upload/b2g-*.android-arm.tar.gz artifacts/b2g-android-arm.tar.gz +mv $OBJDIR/B2G/upload/${TARGET}.zip artifacts/${TARGET}.zip +mv $OBJDIR/B2G/upload/gaia.zip artifacts/gaia.zip diff --git a/testing/docker/phone-builder/bin/validate_task.py b/testing/docker/phone-builder/bin/validate_task.py new file mode 100755 index 000000000000..202bbd80f6de --- /dev/null +++ b/testing/docker/phone-builder/bin/validate_task.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +from __future__ import print_function +import os +import os.path +import json +import urllib2 +import sys +import re + +repo_matcher = re.compile(r'[a-z]+://(hg|git)\.mozilla\.org') + +def get_task(taskid): + return json.load(urllib2.urlopen('https://queue.taskcluster.net/v1/task/' + taskid)) + +def check_task(task): + payload = task['payload'] + + if 'GECKO_HEAD_REPOSITORY' not in payload['env']: + print('Task has no head gecko repository', file=sys.stderr) + return -1 + + repo = payload['env']['GECKO_HEAD_REPOSITORY'] + # if it is not a mozilla repository, fail + if not repo_matcher.match(repo): + print('Invalid head repository', repo, file=sys.stderr) + return -1 + + if 'GECKO_BASE_REPOSITORY' not in payload['env']: + print('Task has no base gecko repository', file=sys.stderr) + return -1 + + repo = payload['env']['GECKO_BASE_REPOSITORY'] + if not repo_matcher.match(repo): + print('Invalid base repository', repo, file=sys.stderr) + return -1 + + if 'artifacts' in payload: + artifacts = payload['artifacts'] + # If any of the artifacts makes reference to 'public', + # abort the task + if any(map(lambda a: 'public' in a, artifacts)): + print('Cannot upload to public', file=sys.stderr) + return -1 + + return 0 + +def main(): + taskid = os.getenv('TASK_ID') + + # If the task id is None, we assume we are running docker locally + if taskid is None: + sys.exit(0) + + task = get_task(taskid) + sys.exit(check_task(task)) + +if __name__ == '__main__': + main() diff --git a/testing/docker/phone-builder/build.sh b/testing/docker/phone-builder/build.sh new file mode 100755 index 000000000000..642d128e81e0 --- /dev/null +++ b/testing/docker/phone-builder/build.sh @@ -0,0 +1,30 @@ +#! /bin/bash -e + +while getopts "t:i:k:" arg; do + case $arg in + t) + TAG=$OPTARG + ;; + i) + KEY_ID=$OPTARG + ;; + k) + SECRET_KEY=$OPTARG + ;; + esac +done + +pushd $(dirname $0) + +test $TAG +test $KEY_ID +test $SECRET_KEY + +(echo '[default]' +echo "aws_access_key_id = $KEY_ID" +echo "aws_secret_access_key = $SECRET_KEY") > config + +docker build -t $TAG . +rm -f config + +popd diff --git a/testing/docker/phone-builder/system-setup.sh b/testing/docker/phone-builder/system-setup.sh new file mode 100755 index 000000000000..e21f16d1627d --- /dev/null +++ b/testing/docker/phone-builder/system-setup.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +pip install awscli + +# Necessary for dolhin kernel building +yum install -y bc + +# Remove ourselves +rm -f $0 diff --git a/testing/docker/phone-builder/tests/invalid_base_repo.yml b/testing/docker/phone-builder/tests/invalid_base_repo.yml new file mode 100644 index 000000000000..79598a013208 --- /dev/null +++ b/testing/docker/phone-builder/tests/invalid_base_repo.yml @@ -0,0 +1,50 @@ +taskId: 1 +task: + metadata: + source: http://todo.com/soon + owner: user@domain.com + name: B2G Emulator + description: B2G Emulator + + workerType: b2gbuild + provisionerId: aws-provisioner + + scopes: + - 'docker-worker:cache:build-emulator-objects' + - 'docker-worker:image:quay.io/mozilla/phone-builder:0.0.1' + + payload: + cache: + build-emulator-objects: '/home/worker/object-folder-flame-kk-1' + + env: + TARGET: 'flame-kk' + B2G_DEBUG: '1' + # revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js + REVISION: 'tip' + GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + GECKO_BASE_REPOSITORY: 'git@github.com:mozilla/gecko-dev.git' + + image: 'quay.io/mozilla/phone-builder:0.0.1' + maxRunTime: 14400 + + command: + - build-phone.sh + + artifacts: + 'private/build': + type: directory + path: '/home/worker/artifacts/' + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'private/build/emulator.tar.gz' + tests: 'private/build/b2g-tests.zip' + symbols: 'private/build/b2g-crashreporter-symbols.zip' + sources: 'private/build/sources.xml' + + treeherder: + symbol: B diff --git a/testing/docker/phone-builder/tests/invalid_head_repo.yml b/testing/docker/phone-builder/tests/invalid_head_repo.yml new file mode 100644 index 000000000000..f9e2acf29914 --- /dev/null +++ b/testing/docker/phone-builder/tests/invalid_head_repo.yml @@ -0,0 +1,50 @@ +taskId: 1 +task: + metadata: + source: http://todo.com/soon + owner: user@domain.com + name: B2G Emulator + description: B2G Emulator + + workerType: b2gbuild + provisionerId: aws-provisioner + + scopes: + - 'docker-worker:cache:build-emulator-objects' + - 'docker-worker:image:quay.io/mozilla/phone-builder:0.0.1' + + payload: + cache: + build-emulator-objects: '/home/worker/object-folder-flame-kk-1' + + env: + TARGET: 'flame-kk' + B2G_DEBUG: '1' + # revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js + REVISION: 'tip' + GECKO_HEAD_REPOSITORY: 'git@github.com:mozilla/gecko-dev.git' + GECKO_BASE_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + + image: 'quay.io/mozilla/phone-builder:0.0.1' + maxRunTime: 14400 + + command: + - build-phone.sh + + artifacts: + 'private/build': + type: directory + path: '/home/worker/artifacts/' + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'private/build/emulator.tar.gz' + tests: 'private/build/b2g-tests.zip' + symbols: 'private/build/b2g-crashreporter-symbols.zip' + sources: 'private/build/sources.xml' + + treeherder: + symbol: B diff --git a/testing/docker/phone-builder/tests/public.yml b/testing/docker/phone-builder/tests/public.yml new file mode 100644 index 000000000000..63d1e18f6f4f --- /dev/null +++ b/testing/docker/phone-builder/tests/public.yml @@ -0,0 +1,50 @@ +taskId: 1 +task: + metadata: + source: http://todo.com/soon + owner: user@domain.com + name: B2G Emulator + description: B2G Emulator + + workerType: b2gbuild + provisionerId: aws-provisioner + + scopes: + - 'docker-worker:cache:build-emulator-objects' + - 'docker-worker:image:quay.io/mozilla/phone-builder:0.0.1' + + payload: + cache: + build-emulator-objects: '/home/worker/object-folder-flame-kk-1' + + env: + TARGET: 'flame-kk' + B2G_DEBUG: '1' + # revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js + REVISION: 'tip' + GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + GECKO_BASE_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + + image: 'quay.io/mozilla/phone-builder:0.0.1' + maxRunTime: 14400 + + command: + - build-phone.sh + + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'public/build/emulator.tar.gz' + tests: 'public/build/b2g-tests.zip' + symbols: 'public/build/b2g-crashreporter-symbols.zip' + sources: 'public/build/sources.xml' + + treeherder: + symbol: B diff --git a/testing/docker/phone-builder/tests/test_validation.py b/testing/docker/phone-builder/tests/test_validation.py new file mode 100755 index 000000000000..083826c00bbd --- /dev/null +++ b/testing/docker/phone-builder/tests/test_validation.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import unittest +import sys +import yaml +sys.path.append('../bin') +from validate_task import check_task + +def load_task(task_file): + content = open(task_file, 'r') + return yaml.load(content)['task'] + +class TaskValidationTest(unittest.TestCase): + def test_valid_task(self): + task = load_task('valid.yml') + self.assertEquals(check_task(task), 0) + + def test_invalid_base_repo(self): + task = load_task('invalid_base_repo.yml') + self.assertEquals(check_task(task), -1) + + def test_invalid_head_repo(self): + task = load_task('invalid_head_repo.yml') + self.assertEquals(check_task(task), -1) + + def test_public_artifact(self): + task = load_task('public.yml') + self.assertEquals(check_task(task), -1) + +if __name__ == '__main__': + unittest.main() diff --git a/testing/docker/phone-builder/tests/valid.yml b/testing/docker/phone-builder/tests/valid.yml new file mode 100644 index 000000000000..fd530d6b0060 --- /dev/null +++ b/testing/docker/phone-builder/tests/valid.yml @@ -0,0 +1,52 @@ +taskId: 1 +task: + metadata: + source: http://todo.com/soon + owner: user@domain.com + name: B2G flame-kk opt + description: B2G flame-kk opt + + workerType: b2gbuild + provisionerId: aws-provisioner + + scopes: + - 'docker-worker:cache:build-phone-objects' + - 'docker-worker:image:{{#docker_image}}phone-builder{{/docker_image}}' + + payload: + cache: + build-phone-objects: '/home/worker/object-folder-flame-kk-1' + + env: + TARGET: 'flame-kk' + B2G_DEBUG: '1' + # revision/project params defined originally here https://github.com/taskcluster/taskcluster-try/blob/master/try/instantiate.js + REVISION: 'tip' + GECKO_HEAD_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + GECKO_BASE_REPOSITORY: 'http://hg.mozilla.org/mozilla-central' + + image: '{{#docker_image}}phone-builder{{/docker_image}}' + maxRunTime: 14400 + + command: + - build-phone.sh + + artifacts: + 'private/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'private/build/b2g-android-arm.tar.gz' + img: 'private/build/flame-kk.zip' + tests: 'private/build/gaia.zip' + symbols: 'private/build/b2g-crashreporter-symbols.zip' + sources: 'private/build/sources.xml' + + treeherder: + symbol: B diff --git a/testing/docker/tester/Dockerfile b/testing/docker/tester/Dockerfile new file mode 100644 index 000000000000..4d524caac05b --- /dev/null +++ b/testing/docker/tester/Dockerfile @@ -0,0 +1,21 @@ +FROM quay.io/mozilla/base-test:0.0.1 +MAINTAINER Jonas Finnemann Jensen + +# Add utilities and configuration +ADD b2g-desktop-config.py /home/worker/b2g-desktop-config.py +ADD test-setup.sh /tmp/test-setup.sh +ADD dot-config /home/worker/.config +ADD dot-pulse /home/worker/.pulse +ADD bin /home/worker/bin +ADD mozharness_configs /home/worker/mozharness_configs + +# Run test setup script +USER root +RUN ["/tmp/test-setup.sh"] +ENV PATH $PATH:/home/worker/bin + +# TODO Re-enable worker when bug 1093833 lands +#USER worker + +# Set a default command useful for debugging +CMD ["/bin/bash", "--login"] diff --git a/testing/docker/tester/VERSION b/testing/docker/tester/VERSION new file mode 100644 index 000000000000..c5d54ec32616 --- /dev/null +++ b/testing/docker/tester/VERSION @@ -0,0 +1 @@ +0.0.9 diff --git a/testing/docker/tester/b2g-desktop-config.py b/testing/docker/tester/b2g-desktop-config.py new file mode 100644 index 000000000000..feb0692d161e --- /dev/null +++ b/testing/docker/tester/b2g-desktop-config.py @@ -0,0 +1,29 @@ +# This is a template config file for b2g desktop unittest production. +import os + +config = { + # mozharness options + "application": "b2g", + + "find_links": [ + "http://pypi.pub.build.mozilla.org/pub", + ], + "pip_index": False, + + "default_actions": [ + 'clobber', + 'read-buildbot-config', + 'download-and-extract', + 'create-virtualenv', + 'install', + 'run-tests', + ], + "download_symbols": "ondemand", + "download_minidump_stackwalk": True, + + "run_file_names": { + "mochitest": "runtestsb2g.py", + "reftest": "runreftestb2g.py", + }, + "in_tree_config": "config/mozharness/b2g_desktop_config.py", +} diff --git a/testing/docker/tester/bin/entrypoint b/testing/docker/tester/bin/entrypoint new file mode 100755 index 000000000000..ce41038079c6 --- /dev/null +++ b/testing/docker/tester/bin/entrypoint @@ -0,0 +1,12 @@ +#! /bin/bash -vex + +# This file is intended to be used as the "entrypoint" or first command in the +# docker image. It uses "eval" so it takes place of the usual /bin/bash -c +# conventions you need when running a docker image. Primarily it +# bootstraps any processes that need to run outside of mozharness (like Xvfb) + +# XXX: Note that all tests could be faster at smaller bit depth +Xvfb :0 -nolisten tcp -screen 0 1600x1200x24 2>/dev/null & +export DISPLAY=:0 + +eval $@ diff --git a/testing/docker/tester/bin/pull_gaia.sh b/testing/docker/tester/bin/pull_gaia.sh new file mode 100755 index 000000000000..d1d6fdafb8cb --- /dev/null +++ b/testing/docker/tester/bin/pull_gaia.sh @@ -0,0 +1,12 @@ +#!/bin/bash -vex + + +gaia_dir=/home/worker/gaia + +# Some mozharness scripts are harcoded to use $PWD/gaia for the gaia repo and +# will delete the directory and clone again if .hg doesn't exist. Does not work +# well when trying to cache +if [ ! -d "$gaia_dir/.hg" ]; then + echo "Cloning gaia into $gaia_dir" + hg clone https://hg.mozilla.org/integration/gaia-central/ $gaia_dir +fi diff --git a/testing/docker/tester/dot-config/user-dirs.dirs b/testing/docker/tester/dot-config/user-dirs.dirs new file mode 100644 index 000000000000..0d19da4e4909 --- /dev/null +++ b/testing/docker/tester/dot-config/user-dirs.dirs @@ -0,0 +1,15 @@ +# This file is written by xdg-user-dirs-update +# If you want to change or add directories, just edit the line you're +# interested in. All local changes will be retained on the next run +# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped +# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an +# absolute path. No other format is supported. +# +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_DOCUMENTS_DIR="$HOME/Documents" +XDG_MUSIC_DIR="$HOME/Music" +XDG_PICTURES_DIR="$HOME/Pictures" +XDG_VIDEOS_DIR="$HOME/Videos" diff --git a/testing/docker/tester/dot-config/user-dirs.locale b/testing/docker/tester/dot-config/user-dirs.locale new file mode 100644 index 000000000000..7741b83a3e0f --- /dev/null +++ b/testing/docker/tester/dot-config/user-dirs.locale @@ -0,0 +1 @@ +en_US diff --git a/testing/docker/tester/dot-pulse/default.pa b/testing/docker/tester/dot-pulse/default.pa new file mode 100644 index 000000000000..39bb44aa7d3a --- /dev/null +++ b/testing/docker/tester/dot-pulse/default.pa @@ -0,0 +1,164 @@ +#!/usr/bin/pulseaudio -nF +# +# This file is part of PulseAudio. +# +# PulseAudio is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# PulseAudio is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with PulseAudio; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# This startup script is used only if PulseAudio is started per-user +# (i.e. not in system mode) + +.nofail + +### Load something into the sample cache +#load-sample-lazy x11-bell /usr/share/sounds/gtk-events/activate.wav +#load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav +#load-sample-lazy pulse-coldplug /usr/share/sounds/startup3.wav +#load-sample-lazy pulse-access /usr/share/sounds/generic.wav + +.fail + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically augment property information from .desktop files +### stored in /usr/share/application +load-module module-augment-properties + +### Load audio drivers statically +### (it's probably better to not load these drivers manually, but instead +### use module-udev-detect -- see below -- for doing this automatically) +#load-module module-alsa-sink +#load-module module-alsa-source device=hw:1,0 +#load-module module-oss device="/dev/dsp" sink_name=output source_name=input +#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input +#load-module module-null-sink +#load-module module-pipe-sink + +### Automatically load driver modules depending on the hardware available +.ifexists module-udev-detect.so +load-module module-udev-detect +.else +### Use the static hardware detection module (for systems that lack udev/hal support) +load-module module-detect +.endif + +### Automatically connect sink and source if JACK server is present +.ifexists module-jackdbus-detect.so +.nofail +load-module module-jackdbus-detect +.fail +.endif + +### Automatically load driver modules for Bluetooth hardware +# This module causes a pulseaudio startup failure on "gecko-tester" +#.ifexists module-bluetooth-discover.so +#load-module module-bluetooth-discover +#.endif + +### Load several protocols +.ifexists module-esound-protocol-unix.so +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +### Network access (may be configured with paprefs, so leave this commented +### here if you plan to use paprefs) +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +#load-module module-zeroconf-publish + +### Load the RTP receiver module (also configured via paprefs, see above) +#load-module module-rtp-recv + +### Load the RTP sender module (also configured via paprefs, see above) +#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'" +#load-module module-rtp-send source=rtp.monitor + +### Load additional modules from GConf settings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gconf.so +.nofail +load-module module-gconf +.fail +.endif + +### Automatically restore the default sink/source when changed by the user +### during runtime +### NOTE: This should be loaded as early as possible so that subsequent modules +### that look up the default sink/source get the right value +load-module module-default-device-restore + +### Automatically move streams to the default sink if the sink they are +### connected to dies, similar for sources +load-module module-rescue-streams + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Honour intended role device property +load-module module-intended-roles + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### If autoexit on idle is enabled we want to make sure we only quit +### when no local session needs us anymore. +# This module causes a pulseaudio startup failure on "gecko-tester" +#.ifexists module-console-kit.so +#load-module module-console-kit +#.endif + +### Enable positioned event sounds +load-module module-position-event-sounds + +### Cork music streams when a phone stream is active +#load-module module-cork-music-on-phone + +### Modules to allow autoloading of filters (such as echo cancellation) +### on demand. module-filter-heuristics tries to determine what filters +### make sense, and module-filter-apply does the heavy-lifting of +### loading modules and rerouting streams. +load-module module-filter-heuristics +load-module module-filter-apply + +### Load DBus protocol +#.ifexists module-dbus-protocol.so +#load-module module-dbus-protocol +#.endif + +# X11 modules should not be started from default.pa so that one daemon +# can be shared by multiple sessions. + +### Load X11 bell module +#load-module module-x11-bell sample=bell-windowing-system + +### Register ourselves in the X11 session manager +#load-module module-x11-xsmp + +### Publish connection data in the X11 root window +#.ifexists module-x11-publish.so +#.nofail +#load-module module-x11-publish +#.fail +#.endif + +load-module module-switch-on-port-available + +### Make some devices default +#set-default-sink output +#set-default-source input diff --git a/testing/docker/tester/mozharness_configs/emulator_override.py b/testing/docker/tester/mozharness_configs/emulator_override.py new file mode 100644 index 000000000000..677c6ebf9b0f --- /dev/null +++ b/testing/docker/tester/mozharness_configs/emulator_override.py @@ -0,0 +1,4 @@ +config = { + "exes": {}, + "busybox_url": "" +} diff --git a/testing/docker/tester/mozharness_configs/gaia_integration_override.py b/testing/docker/tester/mozharness_configs/gaia_integration_override.py new file mode 100644 index 000000000000..8168e8012e4c --- /dev/null +++ b/testing/docker/tester/mozharness_configs/gaia_integration_override.py @@ -0,0 +1,4 @@ +config = { + "exes": {}, + "xre_url": "" +} diff --git a/testing/docker/tester/mozharness_configs/linux_mulet_config.py b/testing/docker/tester/mozharness_configs/linux_mulet_config.py new file mode 100644 index 000000000000..78bdec47086e --- /dev/null +++ b/testing/docker/tester/mozharness_configs/linux_mulet_config.py @@ -0,0 +1,6 @@ +config = { + # Override buildbot specific exes for python and virtualenv + "exes": {}, + # Use taskcluster specified config until Bug 1099057 lands + "in_tree_config": "config/mozharness/taskcluster_linux_config.py" +} diff --git a/testing/docker/tester/mozharness_configs/remove_executables.py b/testing/docker/tester/mozharness_configs/remove_executables.py new file mode 100644 index 000000000000..4af82980a237 --- /dev/null +++ b/testing/docker/tester/mozharness_configs/remove_executables.py @@ -0,0 +1,3 @@ +config = { + "exes": {} +} diff --git a/testing/docker/tester/test-setup.sh b/testing/docker/tester/test-setup.sh new file mode 100755 index 000000000000..f43915b66f43 --- /dev/null +++ b/testing/docker/tester/test-setup.sh @@ -0,0 +1,7 @@ +#!/bin/bash -ve + +pip install virtualenv; +mkdir Documents; mkdir Pictures; mkdir Music; mkdir Videos; mkdir artifacts +hg clone http://hg.mozilla.org/build/mozharness/ +echo 'Xvfb :0 -nolisten tcp -screen 0 1600x1200x24 &> /dev/null &' >> .bashrc +chown -R worker:worker /home/worker/* /home/worker/.* diff --git a/testing/marionette/client/marionette/geckoinstance.py b/testing/marionette/client/marionette/geckoinstance.py index 1f0d9c51a0ac..700ce81ad3f5 100644 --- a/testing/marionette/client/marionette/geckoinstance.py +++ b/testing/marionette/client/marionette/geckoinstance.py @@ -149,10 +149,25 @@ class GeckoInstance(object): self.start() class B2GDesktopInstance(GeckoInstance): - required_prefs = {"focusmanager.testmode": True} - - def __init__(self, **kwargs): - super(B2GDesktopInstance, self).__init__(**kwargs) + def __init__(self, host, port, bin, **kwargs): + # Pass a profile and change the binary to -bin so that + # the built-in gaia profile doesn't get touched. + if kwargs.get('profile', None) is None: + # GeckoInstance.start will clone the profile. + kwargs['profile'] = os.path.join(os.path.dirname(bin), + 'gaia', + 'profile') + if '-bin' not in os.path.basename(bin): + if bin.endswith('.exe'): + newbin = bin[:-len('.exe')] + '-bin.exe' + else: + newbin = bin + '-bin' + if os.path.exists(newbin): + bin = newbin + super(B2GDesktopInstance, self).__init__(host, port, bin, **kwargs) + if not self.prefs: + self.prefs = {} + self.prefs["focusmanager.testmode"] = True self.app_args += ['-chrome', 'chrome://b2g/content/shell.html'] class NullOutput(object): diff --git a/testing/marionette/client/marionette/marionette_test.py b/testing/marionette/client/marionette/marionette_test.py index cd45db52a8b9..eaf41149aac5 100644 --- a/testing/marionette/client/marionette/marionette_test.py +++ b/testing/marionette/client/marionette/marionette_test.py @@ -195,6 +195,12 @@ class MetaParameterized(type): return type.__new__(cls, name, bases, attrs) +class JSTest: + head_js_re = re.compile(r"MARIONETTE_HEAD_JS(\s*)=(\s*)['|\"](.*?)['|\"];") + context_re = re.compile(r"MARIONETTE_CONTEXT(\s*)=(\s*)['|\"](.*?)['|\"];") + timeout_re = re.compile(r"MARIONETTE_TIMEOUT(\s*)=(\s*)(\d+);") + inactivity_timeout_re = re.compile(r"MARIONETTE_INACTIVITY_TIMEOUT(\s*)=(\s*)(\d+);") + class CommonTestCase(unittest.TestCase): __metaclass__ = MetaParameterized @@ -486,6 +492,109 @@ setReq.onerror = function() { 'iframe[src*="app://test-container.gaiamobile.org/index.html"]' )) + def run_js_test(self, filename, marionette=None): + ''' + Run a JavaScript test file and collect its set of assertions + into the current test's results. + + :param filename: The path to the JavaScript test file to execute. + May be relative to the current script. + :param marionette: The Marionette object in which to execute the test. + Defaults to self.marionette. + ''' + marionette = marionette or self.marionette + if not os.path.isabs(filename): + # Find the caller's filename and make the path relative to that. + caller_file = sys._getframe(1).f_globals.get('__file__', '') + caller_file = os.path.abspath(caller_file) + filename = os.path.join(os.path.dirname(caller_file), filename) + self.assert_(os.path.exists(filename), + 'Script "%s" must exist' % filename) + original_test_name = self.marionette.test_name + self.marionette.test_name = os.path.basename(filename) + f = open(filename, 'r') + js = f.read() + args = [] + + head_js = JSTest.head_js_re.search(js); + if head_js: + head_js = head_js.group(3) + head = open(os.path.join(os.path.dirname(filename), head_js), 'r') + js = head.read() + js; + + context = JSTest.context_re.search(js) + if context: + context = context.group(3) + else: + context = 'content' + marionette.set_context(context) + + if context != 'chrome': + marionette.navigate('data:text/html,test page') + + timeout = JSTest.timeout_re.search(js) + if timeout: + timeout = timeout.group(3) + marionette.set_script_timeout(timeout) + + inactivity_timeout = JSTest.inactivity_timeout_re.search(js) + if inactivity_timeout: + inactivity_timeout = inactivity_timeout.group(3) + + try: + results = marionette.execute_js_script( + js, + args, + special_powers=True, + inactivity_timeout=inactivity_timeout, + filename=os.path.basename(filename) + ) + + self.assertTrue(not 'timeout' in filename, + 'expected timeout not triggered') + + if 'fail' in filename: + self.assertTrue(len(results['failures']) > 0, + "expected test failures didn't occur") + else: + for failure in results['failures']: + diag = "" if failure.get('diag') is None else failure['diag'] + name = "got false, expected true" if failure.get('name') is None else failure['name'] + self.logger.test_status(self.test_name, name, 'FAIL', + message=diag) + for failure in results['expectedFailures']: + diag = "" if failure.get('diag') is None else failure['diag'] + name = "got false, expected false" if failure.get('name') is None else failure['name'] + self.logger.test_status(self.test_name, name, 'FAIL', + expected='FAIL', message=diag) + for failure in results['unexpectedSuccesses']: + diag = "" if failure.get('diag') is None else failure['diag'] + name = "got true, expected false" if failure.get('name') is None else failure['name'] + self.logger.test_status(self.test_name, name, 'PASS', + expected='FAIL', message=diag) + self.assertEqual(0, len(results['failures']), + '%d tests failed' % len(results['failures'])) + if len(results['unexpectedSuccesses']) > 0: + raise _UnexpectedSuccess('') + if len(results['expectedFailures']) > 0: + raise _ExpectedFailure((AssertionError, AssertionError(''), None)) + + self.assertTrue(results['passed'] + + len(results['failures']) + + len(results['expectedFailures']) + + len(results['unexpectedSuccesses']) > 0, + 'no tests run') + + except ScriptTimeoutException: + if 'timeout' in filename: + # expected exception + pass + else: + self.loglines = marionette.get_logs() + raise + self.marionette.test_name = original_test_name + + class MarionetteTestCase(CommonTestCase): @@ -559,10 +668,6 @@ class MarionetteTestCase(CommonTestCase): class MarionetteJSTestCase(CommonTestCase): - head_js_re = re.compile(r"MARIONETTE_HEAD_JS(\s*)=(\s*)['|\"](.*?)['|\"];") - context_re = re.compile(r"MARIONETTE_CONTEXT(\s*)=(\s*)['|\"](.*?)['|\"];") - timeout_re = re.compile(r"MARIONETTE_TIMEOUT(\s*)=(\s*)(\d+);") - inactivity_timeout_re = re.compile(r"MARIONETTE_INACTIVITY_TIMEOUT(\s*)=(\s*)(\d+);") match_re = re.compile(r"test_(.*)\.js$") def __init__(self, marionette_weakref, methodName='runTest', jsFile=None, **kwargs): @@ -580,86 +685,9 @@ class MarionetteJSTestCase(CommonTestCase): def runTest(self): if self.marionette.session is None: self.marionette.start_session() - self.marionette.test_name = os.path.basename(self.jsFile) self.marionette.execute_script("log('TEST-START: %s');" % self.jsFile.replace('\\', '\\\\')) - f = open(self.jsFile, 'r') - js = f.read() - args = [] - - if os.path.basename(self.jsFile).startswith('test_'): - head_js = self.head_js_re.search(js); - if head_js: - head_js = head_js.group(3) - head = open(os.path.join(os.path.dirname(self.jsFile), head_js), 'r') - js = head.read() + js; - - context = self.context_re.search(js) - if context: - context = context.group(3) - self.marionette.set_context(context) - - if context != "chrome": - self.marionette.navigate('data:text/html,test page') - - timeout = self.timeout_re.search(js) - if timeout: - timeout = timeout.group(3) - self.marionette.set_script_timeout(timeout) - - inactivity_timeout = self.inactivity_timeout_re.search(js) - if inactivity_timeout: - inactivity_timeout = inactivity_timeout.group(3) - - try: - results = self.marionette.execute_js_script(js, - args, - special_powers=True, - inactivity_timeout=inactivity_timeout, - filename=os.path.basename(self.jsFile)) - - self.assertTrue(not 'timeout' in self.jsFile, - 'expected timeout not triggered') - - if 'fail' in self.jsFile: - self.assertTrue(len(results['failures']) > 0, - "expected test failures didn't occur") - else: - for failure in results['failures']: - diag = "" if failure.get('diag') is None else failure['diag'] - name = "got false, expected true" if failure.get('name') is None else failure['name'] - self.logger.test_status(self.test_name, name, 'FAIL', - message=diag) - for failure in results['expectedFailures']: - diag = "" if failure.get('diag') is None else failure['diag'] - name = "got false, expected false" if failure.get('name') is None else failure['name'] - self.logger.test_status(self.test_name, name, 'FAIL', - expected='FAIL', message=diag) - for failure in results['unexpectedSuccesses']: - diag = "" if failure.get('diag') is None else failure['diag'] - name = "got true, expected false" if failure.get('name') is None else failure['name'] - self.logger.test_status(self.test_name, name, 'PASS', - expected='FAIL', message=diag) - self.assertEqual(0, len(results['failures']), - '%d tests failed' % len(results['failures'])) - if len(results['unexpectedSuccesses']) > 0: - raise _UnexpectedSuccess('') - if len(results['expectedFailures']) > 0: - raise _ExpectedFailure((AssertionError, AssertionError(''), None)) - - self.assertTrue(results['passed'] - + len(results['failures']) - + len(results['expectedFailures']) - + len(results['unexpectedSuccesses']) > 0, - 'no tests run') - - except ScriptTimeoutException: - if 'timeout' in self.jsFile: - # expected exception - pass - else: - self.loglines = self.marionette.get_logs() - raise + self.run_js_test(self.jsFile) self.marionette.execute_script("log('TEST-END: %s');" % self.jsFile.replace('\\', '\\\\')) self.marionette.test_name = None diff --git a/testing/marionette/client/marionette/tests/unit/test_run_js_test.py b/testing/marionette/client/marionette/tests/unit/test_run_js_test.py new file mode 100644 index 000000000000..f901460c3ce4 --- /dev/null +++ b/testing/marionette/client/marionette/tests/unit/test_run_js_test.py @@ -0,0 +1,10 @@ +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +from marionette_test import MarionetteTestCase +import unittest + +class TestRunJSTest(MarionetteTestCase): + def test_basic(self): + self.run_js_test('test_simpletest_pass.js') + self.run_js_test('test_simpletest_fail.js') diff --git a/testing/mozbase/mozrunner/tests/test_start.py b/testing/mozbase/mozrunner/tests/test_start.py index d8d553105efa..396584e005ba 100644 --- a/testing/mozbase/mozrunner/tests/test_start.py +++ b/testing/mozbase/mozrunner/tests/test_start.py @@ -40,6 +40,6 @@ class MozrunnerStartTestCase(mozrunnertest.MozrunnerTestCase): def test_start_with_outputTimeout(self): """Start the process and set a timeout""" self.runner.start(outputTimeout=2) - sleep(5) + sleep(15) self.assertFalse(self.runner.is_running()) diff --git a/testing/talos/talos.json b/testing/talos/talos.json index a75772999df9..9fe115a1b6c4 100644 --- a/testing/talos/talos.json +++ b/testing/talos/talos.json @@ -5,7 +5,7 @@ }, "global": { "talos_repo": "https://hg.mozilla.org/build/talos", - "talos_revision": "ebc4327b8cb8" + "talos_revision": "bfd694ae4242" }, "extra_options": { "android": [ "--apkPath=%(apk_path)s" ] @@ -39,7 +39,8 @@ "tests": ["tpaint"] }, "other-snow-e10s": { - "tests": ["tpaint"] + "tests": ["tpaint"], + "talos_options": ["--e10s"] }, "other_nol64": { "tests": ["a11yr", "ts_paint", "tpaint", "sessionrestore", "sessionrestore_no_auto_restore"] @@ -80,7 +81,8 @@ "tests": ["glterrain"] }, "g1-snow-e10s": { - "tests": ["glterrain"] + "tests": ["glterrain"], + "talos_options": ["--e10s"] }, "svgr": { "tests": ["tsvgx", "tsvgr_opacity", "tart", "tscrollx", "cart"] @@ -93,7 +95,8 @@ "tests": ["tsvgx", "tscrollx"] }, "svgr-snow-e10s": { - "tests": ["tsvgx", "tscrollx"] + "tests": ["tsvgx", "tscrollx"], + "talos_options": ["--e10s"] }, "tp5o": { "tests": ["tp5o"], diff --git a/testing/taskcluster/README.md b/testing/taskcluster/README.md new file mode 100644 index 000000000000..ed24d178a10d --- /dev/null +++ b/testing/taskcluster/README.md @@ -0,0 +1,149 @@ +# Taskcluster + Gecko Integration + +## Task conventions + +In order to properly enable task reuse there are a small number of +conventions and parameters that are specialized for build tasks vs test +tasks. The goal here should be to provide as much of the power as +taskcluster but not at the cost of making it easy to support the current +model of build/test. + + +All tasks are in the YAML format and are also processed via mustache to +allow for greater customizations. All tasks have the following +templates variables: + + + - `docker_image`: Helper for always using the latest version of a docker + image that exist in tree. + + ``` + {{#docker_image}}base{{/docker_image}} + ``` + + Will produce something like (see the docker folder): + + ``` + quay.io/mozilla.com/base:0.11 + ``` + + - `from_now`: Helper for crafting a JSON date in the future. + + ``` + {{#from_now}}1 year{{/from_now}} + ``` + + Will produce: + + ``` + 2014-10-19T22:45:45.655Z + ``` + + - `now`: Current time as a json formatted date. + + +### Build tasks + +By convention build tasks are stored in `tasks/builds/` the location of +each particular type of build is specified in `job_flags.yml` (and more +locations in the future) + +#### Task format + +To facilitate better reuse of tasks there are some expectations of the +build tasks. These are required for the test tasks to interact with the +builds correctly but may not effect the builds or indexing services. + +```yaml + +# This is an example of just the special fields. Other fields that are +# required by taskcluster are omitted and documented on http://docs.taskcluster.net/ +task: + + payload: + # Builders usually create at least two important artifacts the build + # and the tests these can be anywhere in the task and also may have + # different path names to include things like arch and extension + artifacts: + # The build this can be anything as long as its referenced in + # locations. + 'public/name_i_made_up.tar.gz': '/path/to/build' + 'public/some_tests.zip': '/path/to/tests' + + extra: + # Build tasks may put their artifacts anywhere but there are common + # resources that test tasks need to do their job correctly so we + # need to provide an easy way to lookup the correct aritfact path. + locations: + build: 'public/name_i_made_up.tar.gz' + tests: 'public/some_tests.zip' +``` + +#### Templates properties + + - repository: Target HG repository (ex: + https://hg.mozilla.org/mozilla-central) + + - revision: Target HG revision for gecko + + - owner: Email address of the committer + +### Test Tasks + +By convention test tasks are stored in `tasks/tests/` the location of +each particular type of build is specified in `job_flags.yml` (and more +locations in the future) + + +#### Template properties + + - repository: Target HG repository (ex: + https://hg.mozilla.org/mozilla-central) + + - revision: Target HG revision for gecko + + - owner: Email address of the committer + + - build_url: Location of the build + + - tests_url: Location of the tests.zip package + + - chunk: Current chunk + + - total_chunks: Total number of chunks + +## Developing + +Running commands via mach is the best way to invoke commands testing +works a little differently (I have not figured out how to invoke +python-test without running install steps first) + + +```sh +mach python-test tests/ +``` + +## Examples: + +Requires [taskcluster-cli](https://github.com/taskcluster/taskcluster-cli). + +```sh +mach taskcluster-trygraph --message 'try: -b do -p all' \ + --head-rev=33c0181c4a25 \ + --head-repository=http://hg.mozilla.org/mozilla-central \ + --owner=jlal@mozilla.com | taskcluster run-graph +``` + +Creating only a build task and submitting to taskcluster: + +```sh +mach taskcluster-build \ + --head-revision=33c0181c4a25 \ + --head-repository=http://hg.mozilla.org/mozilla-central \ + --owner=user@domain.com tasks/builds/b2g_desktop.yml | taskcluster run-task --verbose +``` + +```sh +mach taskcluster-tests --task-id=Mcnvz7wUR_SEMhmWb7cGdQ \ + --owner=user@domain.com tasks/tests/b2g_mochitest.yml | taskcluster run-task --verbose +``` diff --git a/testing/taskcluster/design.md b/testing/taskcluster/design.md new file mode 100644 index 000000000000..e9edb09de794 --- /dev/null +++ b/testing/taskcluster/design.md @@ -0,0 +1,28 @@ +Problems: + +Not all tests work on all platforms +Many tests work on N+1 platforms + +Goals: + +Tests and builds should be loosely coupled (you probably need a build +but you don't always need a build!) + +Workflows: + +1. Try: decide upon a set of builds and tests from a matrix of checkboxes + +2. Branch: decide upon a set of builds based on in tree configuration + (essentially a "fixed" version of try flags) + +3. One off builds / One of tests (which require a build we created + earlier) + +## Build tasks + +No special logic needed but convention of generating artifacts should be followed! + +## Test Tasks + +Always need a build (and likely also need the tests.zip). Should know +what potential builds they can run on. diff --git a/testing/taskcluster/mach_commands.py b/testing/taskcluster/mach_commands.py new file mode 100644 index 000000000000..5efe102cffea --- /dev/null +++ b/testing/taskcluster/mach_commands.py @@ -0,0 +1,520 @@ +# -*- coding: utf-8 -*- + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import os.path +import json +import copy +import datetime +import subprocess +import sys +import urllib2 + +from mach.decorators import ( + CommandArgument, + CommandProvider, + Command, +) + +from taskcluster_graph.commit_parser import parse_commit +from taskcluster_graph.slugid import slugid +from taskcluster_graph.slugidjar import SlugidJar +from taskcluster_graph.from_now import json_time_from_now, current_json_time +from taskcluster_graph.templates import Templates + +import taskcluster_graph.build_task + +ROOT = os.path.dirname(os.path.realpath(__file__)) +DOCKER_ROOT = os.path.join(ROOT, '..', 'docker') + +# XXX: If/when we have the taskcluster queue use construct url instead +ARTIFACT_URL = 'https://queue.taskcluster.net/v1/task/{}/artifacts/{}' +REGISTRY = open(os.path.join(DOCKER_ROOT, 'REGISTRY')).read().strip() + +DEFINE_TASK = 'queue:define-task:aws-provisioner/{}' + +TREEHERDER_ROUTE_PREFIX = 'tc-treeherder-stage' + +DEFAULT_TRY = 'try: -b do -p all -u all' +DEFAULT_JOB_PATH = os.path.join( + ROOT, 'tasks', 'branches', 'mozilla-central', 'job_flags.yml' +) + +def get_hg_url(): + ''' Determine the url for the mercurial repository''' + try: + url = subprocess.check_output( + ['hg', 'path', 'default'], + stderr=subprocess.PIPE + ) + except subprocess.CalledProcessError: + sys.stderr.write( + "Error: Could not determine the current hg repository url. " \ + "Ensure command is executed within a hg respository" + ) + sys.exit(1) + + return url + +def get_latest_hg_revision(repository): + ''' Retrieves the revision number of the latest changed head''' + try: + revision = subprocess.check_output( + ['hg', 'id', '-r', 'tip', repository, '-i'], + stderr=subprocess.PIPE + ).strip('\n') + except subprocess.CalledProcessError: + sys.stderr.write( + "Error: Could not determine the latest hg revision at {} " \ + "Ensure command is executed within a cloned hg respository and " \ + "remote default remote repository is accessible".format(repository) + ) + sys.exit(1) + + return revision + +def docker_image(name): + ''' Determine the docker tag/revision from an in tree docker file ''' + repository_path = os.path.join(DOCKER_ROOT, name, 'REPOSITORY') + repository = REGISTRY + + version = open(os.path.join(DOCKER_ROOT, name, 'VERSION')).read().strip() + + if os.path.isfile(repository_path): + repository = open(repository_path).read().strip() + + return '{}/{}:{}'.format(repository, name, version) + +def get_task(task_id): + return json.load(urllib2.urlopen("https://queue.taskcluster.net/v1/task/" + task_id)) + + +@CommandProvider +class DecisionTask(object): + @Command('taskcluster-decision', category="ci", + description="Build a decision task") + @CommandArgument('--project', + required=True, + help='Treeherder project name') + @CommandArgument('--url', + required=True, + help='Gecko repository to use as head repository.') + @CommandArgument('--revision', + required=True, + help='Revision for this project') + @CommandArgument('--comment', + required=True, + help='Commit message for this revision') + @CommandArgument('--owner', + required=True, + help='email address of who owns this graph') + @CommandArgument('task', help="Path to decision task to run.") + def run_task(self, **params): + templates = Templates(ROOT) + # Template parameters used when expanding the graph + parameters = { + 'source': 'http://todo.com/soon', + 'project': params['project'], + 'comment': params['comment'], + 'url': params['url'], + 'revision': params['revision'], + 'owner': params['owner'], + 'as_slugid': SlugidJar(), + 'from_now': json_time_from_now, + 'now': datetime.datetime.now().isoformat() + } + task = templates.load(params['task'], parameters) + print(json.dumps(task, indent=4)) + +@CommandProvider +class Graph(object): + @Command('taskcluster-graph', category="ci", + description="Create taskcluster task graph") + @CommandArgument('--base-repository', + default=os.environ.get('GECKO_BASE_REPOSITORY'), + help='URL for "base" repository to clone') + @CommandArgument('--mozharness-repository', + default='http://hg.mozilla.org/build/mozharness', + help='URL for custom mozharness repo') + @CommandArgument('--head-repository', + default=os.environ.get('GECKO_HEAD_REPOSITORY'), + help='URL for "head" repository to fetch revision from') + @CommandArgument('--head-ref', + default=os.environ.get('GECKO_HEAD_REF'), + help='Reference (this is same as rev usually for hg)') + @CommandArgument('--head-rev', + default=os.environ.get('GECKO_HEAD_REV'), + help='Commit revision to use from head repository') + @CommandArgument('--mozharness-rev', + default='tip', + help='Commit revision to use from mozharness repository') + @CommandArgument('--message', + help='Commit message to be parsed. Example: "try: -b do -p all -u all"') + @CommandArgument('--revision-hash', + required=False, + help='Treeherder revision hash to attach results to') + @CommandArgument('--project', + required=True, + help='Project to use for creating task graph. Example: --project=try') + @CommandArgument('--owner', + required=True, + help='email address of who owns this graph') + @CommandArgument('--extend-graph', + action="store_true", dest="ci", help='Omit create graph arguments') + def create_graph(self, **params): + project = params['project'] + message = params.get('message', '') if project == 'try' else DEFAULT_TRY + + # Message would only be blank when not created from decision task + if project == 'try' and not message: + sys.stderr.write( + "Must supply commit message when creating try graph. " \ + "Example: --message='try: -b do -p all -u all'" + ) + sys.exit(1) + + templates = Templates(ROOT) + job_path = os.path.join(ROOT, 'tasks', 'branches', project, 'job_flags.yml') + job_path = job_path if os.path.exists(job_path) else DEFAULT_JOB_PATH + + jobs = templates.load(job_path, {}) + + job_graph = parse_commit(message, jobs) + # Template parameters used when expanding the graph + parameters = { + 'docker_image': docker_image, + 'base_repository': params['base_repository'] or \ + params['head_repository'], + 'head_repository': params['head_repository'], + 'head_ref': params['head_ref'] or params['head_rev'], + 'head_rev': params['head_rev'], + 'owner': params['owner'], + 'from_now': json_time_from_now, + 'now': datetime.datetime.now().isoformat(), + 'mozharness_repository': params['mozharness_repository'], + 'mozharness_rev': params['mozharness_rev'], + 'revision_hash': params['revision_hash'] + } + + treeherder_route = '{}.{}.{}'.format( + TREEHERDER_ROUTE_PREFIX, + params['project'], + params.get('revision_hash', '') + ) + + # Task graph we are generating for taskcluster... + graph = { + 'tasks': [], + 'scopes': [] + } + + if params['revision_hash']: + graph['scopes'].append('queue:route:{}'.format(treeherder_route)) + + graph['metadata'] = { + 'source': 'http://todo.com/what/goes/here', + 'owner': params['owner'], + # TODO: Add full mach commands to this example? + 'description': 'Task graph generated via ./mach taskcluster-graph', + 'name': 'task graph local' + } + + for build in job_graph: + build_parameters = dict(parameters) + build_parameters['build_slugid'] = slugid() + build_task = templates.load(build['task'], build_parameters) + + if 'routes' not in build_task['task']: + build_task['task']['routes'] = []; + + if params['revision_hash']: + build_task['task']['routes'].append(treeherder_route) + + # Ensure each build graph is valid after construction. + taskcluster_graph.build_task.validate(build_task) + graph['tasks'].append(build_task) + + tests_url = ARTIFACT_URL.format( + build_parameters['build_slugid'], + build_task['task']['extra']['locations']['tests'] + ) + + build_url = ARTIFACT_URL.format( + build_parameters['build_slugid'], + build_task['task']['extra']['locations']['build'] + ) + + define_task = DEFINE_TASK.format(build_task['task']['workerType']) + + graph['scopes'].append(define_task) + graph['scopes'].extend(build_task['task'].get('scopes', [])) + + # Treeherder symbol configuration for the graph required for each + # build so tests know which platform they belong to. + build_treeherder_config = build_task['task']['extra']['treeherder'] + + if 'machine' not in build_treeherder_config: + message = '({}), extra.treeherder.machine required for all builds' + raise ValueError(message.format(build['task'])) + + if 'build' not in build_treeherder_config: + build_treeherder_config['build'] = \ + build_treeherder_config['machine'] + + if 'collection' not in build_treeherder_config: + build_treeherder_config['collection'] = { 'opt': True } + + if len(build_treeherder_config['collection'].keys()) != 1: + message = '({}), extra.treeherder.collection must contain one type' + raise ValueError(message.fomrat(build['task'])) + + for test in build['dependents']: + test = test['allowed_build_tasks'][build['task']] + test_parameters = copy.copy(build_parameters) + test_parameters['build_url'] = build_url + test_parameters['tests_url'] = tests_url + test_parameters['total_chunks'] = 1 + + if 'chunks' in test: + test_parameters['total_chunks'] = test['chunks'] + + for chunk in range(1, test_parameters['total_chunks'] + 1): + test_parameters['chunk'] = chunk + test_task = templates.load(test['task'], test_parameters) + test_task['taskId'] = slugid() + + if 'requires' not in test_task: + test_task['requires'] = [] + + test_task['requires'].append(test_parameters['build_slugid']) + + if 'treeherder' not in test_task['task']['extra']: + test_task['task']['extra']['treeherder'] = {} + + # Copy over any treeherder configuration from the build so + # tests show up under the same platform... + test_treeherder_config = test_task['task']['extra']['treeherder'] + + test_treeherder_config['collection'] = \ + build_treeherder_config.get('collection', {}) + + test_treeherder_config['build'] = \ + build_treeherder_config.get('build', {}) + + test_treeherder_config['machine'] = \ + build_treeherder_config.get('machine', {}) + + if 'routes' not in test_task['task']: + test_task['task']['routes'] = [] + + if 'scopes' not in test_task['task']: + test_task['task']['scopes'] = [] + + if params['revision_hash']: + test_task['task']['routes'].append(treeherder_route) + test_task['task']['scopes'].append('queue:route:{}'.format(treeherder_route)) + + graph['tasks'].append(test_task) + + define_task = DEFINE_TASK.format( + test_task['task']['workerType'] + ) + + graph['scopes'].append(define_task) + graph['scopes'].extend(test_task['task'].get('scopes', [])) + + graph['scopes'] = list(set(graph['scopes'])) + + # When we are extending the graph remove extra fields... + if params['ci'] is True: + graph.pop('scopes', None) + graph.pop('metadata', None) + + print(json.dumps(graph, indent=4)) + +@CommandProvider +class CIBuild(object): + @Command('taskcluster-build', category='ci', + description="Create taskcluster try server build task") + @CommandArgument('--base-repository', + help='URL for "base" repository to clone') + @CommandArgument('--mozharness-repository', + default='http://hg.mozilla.org/build/mozharness', + help='URL for custom mozharness repo') + @CommandArgument('--head-repository', + required=True, + help='URL for "head" repository to fetch revision from') + @CommandArgument('--head-ref', + help='Reference (this is same as rev usually for hg)') + @CommandArgument('--head-rev', + required=True, + help='Commit revision to use') + @CommandArgument('--mozharness-rev', + default='tip', + help='Commit revision to use from mozharness repository') + @CommandArgument('--owner', + required=True, + help='email address of who owns this graph') + @CommandArgument('build_task', + help='path to build task definition') + def create_ci_build(self, **params): + templates = Templates(ROOT) + # TODO handle git repos + head_repository = params['head_repository'] + if not head_repository: + head_repository = get_hg_url() + + head_rev = params['head_rev'] + if not head_rev: + head_rev = get_latest_hg_revision(head_repository) + + head_ref = params['head_ref'] or head_rev + + build_parameters = { + 'docker_image': docker_image, + 'owner': params['owner'], + 'from_now': json_time_from_now, + 'now': current_json_time(), + 'base_repository': params['base_repository'] or head_repository, + 'head_repository': head_repository, + 'head_rev': head_rev, + 'head_ref': head_ref, + 'mozharness_repository': params['mozharness_repository'], + 'mozharness_rev': params['mozharness_rev'] + } + + try: + build_task = templates.load(params['build_task'], build_parameters) + except IOError: + sys.stderr.write( + "Could not load build task file. Ensure path is a relative " \ + "path from testing/taskcluster" + ) + sys.exit(1) + + taskcluster_graph.build_task.validate(build_task) + + print(json.dumps(build_task['task'], indent=4)) + +@CommandProvider +class CITest(object): + @Command('taskcluster-test', category='ci', + description='Create taskcluster try server test task') + @CommandArgument('--task-id', + help='the task id to pick the correct build and tests') + @CommandArgument('--total-chunks', type=int, + help='total number of chunks') + @CommandArgument('--chunk', type=int, + help='current chunk') + @CommandArgument('--owner', + help='email address of who owns this graph') + @CommandArgument('test_task', + help='path to the test task definition') + def create_ci_test(self, test_task, task_id='', total_chunks=1, chunk=1, owner=''): + if total_chunks is None: + total_chunks = 1 + + if chunk is None: + chunk = 1 + + if chunk < 1 or chunk > total_chunks: + raise ValueError( + '"chunk" must be a value between 1 and "total_chunks (default 1)"') + + build_url, tests_url = self._get_build_and_tests_url(task_id) + + test_parameters = { + 'docker_image': docker_image, + 'build_url': ARTIFACT_URL.format(task_id, build_url), + 'tests_url': ARTIFACT_URL.format(task_id, tests_url), + 'total_chunks': total_chunks, + 'chunk': chunk, + 'owner': owner, + 'from_now': json_time_from_now, + 'now': current_json_time() + } + + try: + test_task = import_yaml(test_task, test_parameters) + except IOError: + sys.stderr.write( + "Could not load test task file. Ensure path is a relative " \ + "path from testing/taskcluster" + ) + sys.exit(1) + + print(json.dumps(test_task['task'], indent=4)) + + def _get_build_and_tests_url(self, task_id): + task = get_task(task_id) + locations = task['extra']['locations'] + return locations['build'], locations['tests'] + +@CommandProvider +class CIDockerRun(object): + @Command('taskcluster-docker-run', category='ci', + description='Run a docker image and optionally mount local hg repos. ' \ + 'Repos will be mounted to /home/worker/x/source accordingly. ' \ + 'For example, to run a centos image and mount local gecko ' \ + 'and gaia repos: mach ci-docker-run --local-gecko-repo ' \ + '/home/user/mozilla-central/ --local-gaia-repo /home/user/gaia/ '\ + '--docker-flags="-t -i" centos:centos7 /bin/bash') + @CommandArgument('--local-gecko-repo', + action='store', dest='local_gecko_repo', + help='local gecko hg repository for volume mount') + @CommandArgument('--gecko-revision', + action='store', dest='gecko_revision', + help='local gecko repo revision (defaults to latest)') + @CommandArgument('--local-gaia-repo', + action='store', dest='local_gaia_repo', + help='local gaia hg repository for volume mount') + @CommandArgument('--mozconfig', + help='The mozconfig file for building gecko') + @CommandArgument('--docker-flags', + action='store', dest='flags', + help='string of run flags (i.e. --docker-flags="-i -t")') + @CommandArgument('image', + help='name of docker image to run') + @CommandArgument('command', + nargs='*', + help='command to run inside the docker image') + def ci_docker_run(self, local_gecko_repo='', gecko_revision='', + local_gaia_repo='', mozconfig="", flags="", **kwargs): + ''' Run docker image and optionally volume mount specified local repos ''' + gecko_mount_point='/home/worker/mozilla-central/source/' + gaia_mount_point='/home/worker/gaia/source/' + cmd_out = ['docker', 'run'] + if flags: + cmd_out.extend(flags.split()) + if local_gecko_repo: + if not os.path.exists(local_gecko_repo): + print("Gecko repository path doesn't exist: %s" % local_gecko_repo) + sys.exit(1) + if not gecko_revision: + gecko_revision = get_latest_hg_revision(local_gecko_repo) + cmd_out.extend(['-v', '%s:%s' % (local_gecko_repo, gecko_mount_point)]) + cmd_out.extend(['-e', 'REPOSITORY=%s' % gecko_mount_point]) + cmd_out.extend(['-e', 'REVISION=%s' % gecko_revision]) + if local_gaia_repo: + if not os.path.exists(local_gaia_repo): + print("Gaia repository path doesn't exist: %s" % local_gaia_repo) + sys.exit(1) + cmd_out.extend(['-v', '%s:%s' % (local_gaia_repo, gaia_mount_point)]) + cmd_out.extend(['-e', 'GAIA_REPOSITORY=%s' % gaia_mount_point]) + if mozconfig: + cmd_out.extend(['-e', 'MOZCONFIG=%s' % mozconfig]) + cmd_out.append(kwargs['image']) + for cmd_x in kwargs['command']: + cmd_out.append(cmd_x) + try: + subprocess.check_call(cmd_out) + except subprocess.CalledProcessError: + sys.stderr.write("Docker run command returned non-zero status. Attempted:\n") + cmd_line = '' + for x in cmd_out: + cmd_line = cmd_line + x + ' ' + sys.stderr.write(cmd_line + '\n') + sys.exit(1) diff --git a/testing/taskcluster/requirements.txt b/testing/taskcluster/requirements.txt new file mode 100644 index 000000000000..6f68df198a55 --- /dev/null +++ b/testing/taskcluster/requirements.txt @@ -0,0 +1,2 @@ +pystache == 0.5.4 +PyYAML == 3.11 diff --git a/testing/taskcluster/setup.py b/testing/taskcluster/setup.py new file mode 100644 index 000000000000..e92fcc1dfbba --- /dev/null +++ b/testing/taskcluster/setup.py @@ -0,0 +1,19 @@ +import os +from setuptools import setup, find_packages +import sys + +version = '0.0.0' + +# dependencies +with open('requirements.txt') as f: + deps = f.read().splitlines() + +setup(name='taskcluster_graph', + version=version, + description='', + classifiers=[], + keywords='mozilla', + license='MPL', + packages=['taskcluster_graph'], + install_requires=deps, + ) diff --git a/dom/icc/tests/IccInfo.cpp b/testing/taskcluster/taskcluster_graph/__init__.py similarity index 100% rename from dom/icc/tests/IccInfo.cpp rename to testing/taskcluster/taskcluster_graph/__init__.py diff --git a/testing/taskcluster/taskcluster_graph/build_task.py b/testing/taskcluster/taskcluster_graph/build_task.py new file mode 100644 index 000000000000..0b76631f027d --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/build_task.py @@ -0,0 +1,33 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +# This module contains logic related to build tasks + +class BuildTaskValidationException(Exception): + pass + +# XXX: Consider using JSON Schema here like we do elsewhere... +def validate(task): + ''' + The build tasks have some required fields in extra this function ensures + they are there. + ''' + if 'task' not in task: + raise BuildTaskValidationException('must have task field') + + task_def = task['task'] + + if 'extra' not in task_def: + raise BuildTaskValidationException('build task must have task.extra props') + + if 'locations' not in task_def['extra']: + raise BuildTaskValidationException('task.extra.locations missing') + + locations = task_def['extra']['locations'] + + if 'build' not in locations: + raise BuildTaskValidationException('task.extra.locations.build missing') + + if 'tests' not in locations: + raise BuildTaskValidationException('task.extra.locations.tests missing') diff --git a/testing/taskcluster/taskcluster_graph/commit_parser.py b/testing/taskcluster/taskcluster_graph/commit_parser.py new file mode 100644 index 000000000000..8f4460801676 --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/commit_parser.py @@ -0,0 +1,183 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + + +import shlex +import argparse +import functools +import copy +from try_test_parser import parse_test_opts + +TRY_DELIMITER='try:' + +# The build type aliases are very cryptic and only used in try flags these are +# mappings from the single char alias to a longer more recognizable form. +BUILD_TYPE_ALIASES = { + 'o': 'opt', + 'd': 'debug' +} + +class InvalidCommitException(Exception): + pass + +def normalize_platform_list(all_builds, build_list): + if build_list == 'all': + return all_builds + + return [ build.strip() for build in build_list.split(',') ] + +def normalize_test_list(all_tests, job_list): + ''' + Normalize a set of jobs (builds or tests) there are three common cases: + + - job_list is == 'none' (meaning an empty list) + - job_list is == 'all' (meaning use the list of jobs for that job type) + - job_list is comma delimited string which needs to be split + + :param list all_tests: test flags from job_flags.yml structure. + :param str job_list: see above examples. + :returns: List of jobs + ''' + + # Empty job list case... + if job_list is None or job_list == 'none': + return [] + + tests = parse_test_opts(job_list) + + if not tests: + return [] + + # Special case where tests is 'all' and must be expanded + if tests[0]['test'] == 'all': + results = [] + all_entry = tests[0] + for test in all_tests: + entry = { 'test': test } + # If there are platform restrictions copy them across the list. + if 'platforms' in all_entry: + entry['platforms'] = list(all_entry['platforms']) + results.append(entry) + return results + else: + return tests + +def extract_tests_from_platform(test_jobs, build_platform, build_task, tests): + ''' + Build the list of tests from the current build. + + :param dict test_jobs: Entire list of tests (from job_flags.yml). + :param dict build_platform: Current build platform. + :param str build_task: Build task path. + :param list tests: Test flags. + :return: List of tasks (ex: [{ task: 'test_task.yml' }] + ''' + if tests is None: + return [] + + results = [] + + for test_entry in tests: + if test_entry['test'] not in test_jobs: + continue + + test_job = test_jobs[test_entry['test']] + + # Verify that this job can actually be run on this build task... + if 'allowed_build_tasks' in test_job and build_task not in test_job['allowed_build_tasks']: + continue + + if 'platforms' in test_entry: + # The default here is _exclusive_ rather then inclusive so if the + # build platform does not specify what platform(s) it belongs to + # then we must skip it. + if 'platforms' not in build_platform: + continue + + # Sorta hack to see if the two lists intersect at all if they do not + # then we must skip this set. + common_platforms = set(test_entry['platforms']) & set(build_platform['platforms']) + if not common_platforms: + # Tests should not run on this platform... + continue + + # Add the job to the list and ensure to copy it so we don't accidentally + # mutate the state of the test job in the future... + results.append(copy.deepcopy(test_job)) + + return results + +''' +This module exists to deal with parsing the options flags that try uses. We do +not try to build a graph or anything here but match up build flags to tasks via +the "jobs" datastructure (see job_flags.yml) +''' + +def parse_commit(message, jobs): + ''' + :param message: Commit message that is typical to a try push. + :param jobs: Dict (see job_flags.yml) + ''' + + # shlex used to ensure we split correctly when giving values to argparse. + parts = shlex.split(message) + + if parts[0] != TRY_DELIMITER: + raise InvalidCommitException('Invalid commit format must start with' + + TRY_DELIMITER) + + # Argument parser based on try flag flags + parser = argparse.ArgumentParser() + parser.add_argument('-b', dest='build_types') + parser.add_argument('-p', dest='platforms') + parser.add_argument('-u', dest='tests') + args, unknown = parser.parse_known_args(parts[1:]) + + # Sanity check platforms... + if args.platforms is None: + return [] + + # Then builds... + if args.build_types is None: + return [] + + build_types = [ BUILD_TYPE_ALIASES.get(build_type, build_type) for + build_type in args.build_types ] + + platforms = normalize_platform_list(jobs['flags']['builds'], args.platforms) + tests = normalize_test_list(jobs['flags']['tests'], args.tests) + + result = [] + + # Expand the matrix of things! + for platform in platforms: + # Silently skip unknown platforms. + if platform not in jobs['builds']: + continue + + platform_builds = jobs['builds'][platform] + + for build_type in build_types: + # Not all platforms have debug builds, etc... + if build_type not in platform_builds['types']: + continue + + platform_build = platform_builds['types'][build_type] + build_task = platform_build['task'] + + if 'additional-parameters' in platform_build: + additional_parameters = platform_build['additional-parameters'] + else: + additional_parameters = {} + + # Node for this particular build type + result.append({ + 'task': build_task, + 'dependents': extract_tests_from_platform( + jobs['tests'], platform_builds, build_task, tests + ), + 'additional-parameters': additional_parameters + }) + + return result diff --git a/testing/taskcluster/taskcluster_graph/from_now.py b/testing/taskcluster/taskcluster_graph/from_now.py new file mode 100644 index 000000000000..8f5a7bee0811 --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/from_now.py @@ -0,0 +1,85 @@ +# Python port of the ms.js node module this is not a direct port some things are +# more complicated or less precise and we lean on time delta here. + +import re +import datetime + +PATTERN=re.compile( + '((?:\d+)?\.?\d+) *([a-z])' +) + +def seconds(value): + return datetime.timedelta(seconds=int(value)) + +def minutes(value): + return datetime.timedelta(minutes=int(value)) + +def hours(value): + return datetime.timedelta(hours=int(value)) + +def days (value): + return datetime.timedelta(days=int(value)) + +def years(value): + # Warning here "years" are vague don't use this for really sensitive date + # computation the idea is to give you a absolute amount of time in the + # future which is not the same thing as "precisely on this date next year" + return datetime.timedelta(days=int(value) * 365) + +ALIASES = {} +ALIASES['seconds'] = ALIASES['second'] = ALIASES['s'] = seconds +ALIASES['minutes'] = ALIASES['minute'] = ALIASES['m'] = minutes +ALIASES['hours'] = ALIASES['hour'] = ALIASES['h'] = hours +ALIASES['days'] = ALIASES['day'] = ALIASES['d'] = days +ALIASES['years'] = ALIASES['year'] = ALIASES['y'] = years + +class InvalidString(Exception): + pass + +class UnknownTimeMeasurement(Exception): + pass + +def value_of(input_str): + ''' + Convert a string to a json date in the future + :param str input_str: (ex: 1d, 2d, 6years, 2 seconds) + :returns: Unit given in seconds + ''' + + matches = PATTERN.search(input_str) + + if matches is None or len(matches.groups()) < 2: + raise InvalidString("'{}' is invalid string".format(input_str)) + + value, unit = matches.groups() + + if unit not in ALIASES: + raise UnknownTimeMeasurement( + '{} is not a valid time measure use one of {}'.format(unit, + sorted(ALIASES.keys())) + ) + + return ALIASES[unit](value) + +def json_time_from_now(input_str, now=None): + ''' + :param str input_str: Input string (see value of) + :param datetime now: Optionally set the definition of `now` + :returns: JSON string representation of time in future. + ''' + + if now is None: + now = datetime.datetime.utcnow() + + time = now + value_of(input_str) + + # Sorta a big hack but the json schema validator for date does not like the + # ISO dates until 'Z' (for timezone) is added... + return time.isoformat() + 'Z' + +def current_json_time(): + ''' + :returns: JSON string representation of the current time. + ''' + + return datetime.datetime.utcnow().isoformat() + 'Z' diff --git a/testing/taskcluster/taskcluster_graph/slugid.py b/testing/taskcluster/taskcluster_graph/slugid.py new file mode 100644 index 000000000000..9a872f8bf293 --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/slugid.py @@ -0,0 +1,14 @@ +import uuid +import base64 + +def slugid(): + ''' + Logic and rational of this construct here: + https://github.com/jonasfj/slugid/blob/29be40074646b97e5ed02da257918467fac07c4a/slugid.js#L46 + ''' + encoded = base64.b64encode(str(uuid.uuid4().bytes)) + encoded = encoded.replace('+', '-') # Replace + with - (see RFC 4648, sec. 5) + encoded = encoded.replace('/', '_') # Replace + with - (see RFC 4648, sec. 5) + encoded = encoded.replace('=', '') # Drop '==' padding + + return encoded diff --git a/testing/taskcluster/taskcluster_graph/slugidjar.py b/testing/taskcluster/taskcluster_graph/slugidjar.py new file mode 100644 index 000000000000..838d167ba3a5 --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/slugidjar.py @@ -0,0 +1,20 @@ +from taskcluster_graph.slugid import slugid + +class SlugidJar(): + ''' + Container of seen slugid's used to implement the as_slugid functionality + used in the task graph templates. + ''' + def __init__(self): + self._names = {} + + def __call__(self, name): + ''' + So this object can easily be passed to mustache we allow it to be called + directly... + ''' + if name in self._names: + return self._names[name]; + + self._names[name] = slugid() + return self._names[name] diff --git a/testing/taskcluster/taskcluster_graph/templates.py b/testing/taskcluster/taskcluster_graph/templates.py new file mode 100644 index 000000000000..e5cc0f710409 --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/templates.py @@ -0,0 +1,131 @@ +import os + +import pystache +import yaml + +# Key used in template inheritance... +INHERITS_KEY = '$inherits' + +def merge_to(source, dest): + ''' + Merge dict and arrays (override scalar values) + + :param dict source: to copy from + :param dict dest: to copy to. + ''' + + for key, value in source.items(): + # Override mismatching or empty types + if type(value) != type(dest.get(key)): + dest[key] = source[key] + continue + + # Merge dict + if isinstance(value, dict): + merge_to(value, dest[key]) + continue + + if isinstance(value, list): + dest[key] = dest[key] + source[key] + continue + + dest[key] = source[key] + + return dest + +class TemplatesException(Exception): + pass + +class Templates(): + ''' + The taskcluster integration makes heavy use of yaml to describe tasks this + class handles the loading/rendering. + ''' + + def __init__(self, root): + ''' + Initialize the template render. + + :param str root: Root path where to load yaml files. + ''' + if not root: + raise TemplatesException('Root is required') + + if not os.path.isdir(root): + raise TemplatesException('Root must be a directory') + + self.root = root; + + def _inherits(self, path, obj, properties, seen): + blueprint = obj.pop(INHERITS_KEY) + seen.add(path) + + # Resolve the path here so we can detect circular references. + template = self.resolve_path(blueprint.get('from')) + variables = blueprint.get('variables', {}) + + # Passed parameters override anything in the task itself. + for key in properties: + variables[key] = properties[key] + + if not template: + msg = '"{}" inheritance template missing'.format(path) + raise TemplatesException(msg) + + if template in seen: + msg = 'Error while handling "{}" in "{}" circular template' + \ + 'inheritance seen \n {}' + raise TemplatesException(msg.format(path, template, seen)) + + try: + out = self.load(template, variables, seen) + except TemplatesException as e: + msg = 'Error expanding parent ("{}") of "{}" original error {}' + raise TemplatesException(msg.format(template, path, str(e))) + + # Anything left in obj is merged into final results (and overrides) + return merge_to(obj, out) + + + + def render(self, path, content, parameters, seen): + ''' + Renders a given yaml string. + + :param str path: used to prevent infinite recursion in inheritance. + :param str content: Of yaml file. + :param dict parameters: For mustache templates. + :param set seen: Seen files (used for inheritance) + ''' + content = pystache.render(content, parameters) + result = yaml.load(content) + + # In addition to the usual template logic done by mustache we also + # handle special '$inherit' dict keys. + if isinstance(result, dict) and INHERITS_KEY in result: + return self._inherits(path, result, parameters, seen) + + return result + + def resolve_path(self, path): + return os.path.join(self.root, path) + + def load(self, path, parameters=None, seen=None): + ''' + Load an render the given yaml path. + + :param str path: Location of yaml file to load (relative to root). + :param dict parameters: To template yaml file with. + ''' + seen = seen or set() + + if not path: + raise TemplatesException('path is required') + + path = self.resolve_path(path) + + if not os.path.isfile(path): + raise TemplatesException('"{}" is not a file'.format(path)) + + content = open(path).read() + return self.render(path, content, parameters, seen) diff --git a/testing/taskcluster/taskcluster_graph/try_test_parser.py b/testing/taskcluster/taskcluster_graph/try_test_parser.py new file mode 100644 index 000000000000..5f7257fe488a --- /dev/null +++ b/testing/taskcluster/taskcluster_graph/try_test_parser.py @@ -0,0 +1,57 @@ +def parse_test_opts(input_str): + ''' + Test argument parsing is surprisingly complicated with the "restrictions" + logic this function is responsible for parsing this out into a easier to + work with structure like { test: '..', platforms: ['..'] } + ''' + + # Final results which we will return. + tests = [] + + cur_test = {} + token = '' + in_platforms = False + + def add_test(value): + cur_test['test'] = value.strip() + tests.insert(0, cur_test) + + def add_platform(value): + cur_test['platforms'].insert(0, value.strip()) + + # This might be somewhat confusing but we parse the string _backwards_ so + # there is no ambiguity over what state we are in. + for char in reversed(input_str): + + # , indicates exiting a state + if char == ',': + + # Exit a particular platform. + if in_platforms: + add_platform(token) + + # Exit a particular test. + else: + add_test(token) + cur_test = {} + + # Token must always be reset after we exit a state + token = '' + elif char == '[': + # Exiting platform state entering test state. + add_platform(token) + token = '' + in_platforms = False + elif char == ']': + # Entering platform state. + in_platforms = True + cur_test['platforms'] = [] + else: + # Accumulator. + token = char + token + + # Handle any left over tokens. + if token: + add_test(token) + + return tests diff --git a/testing/taskcluster/tasks/branches/alder/job_flags.yml b/testing/taskcluster/tasks/branches/alder/job_flags.yml new file mode 100644 index 000000000000..124453d451b5 --- /dev/null +++ b/testing/taskcluster/tasks/branches/alder/job_flags.yml @@ -0,0 +1,75 @@ +--- +# For complete sample of all build and test jobs, +# see /testing/taskcluster/tasks/job_flags.yml + +$inherits: + from: tasks/branches/base_job_flags.yml + +builds: + linux64_gecko: + platforms: + - b2g + types: + opt: + task: tasks/builds/b2g_desktop_opt.yml + debug: + task: tasks/builds/b2g_desktop_debug.yml + linux64-mulet: + platforms: + - b2g + types: + opt: + task: tasks/builds/mulet_linux.yml + +tests: + gaia-build: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_test.yml + gaia-build-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_unit.yml + gaia-js-integration: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 4 + gaia-linter: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_linter.yml + gaia-ui-test-accessibility: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + tasks/builds/b2g_emulator.yml: + task: tasks/tests/b2g_emulator_gaia_ui_test_accessibility.yml + gaia-ui-test-functional: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + gaia-ui-test-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + gaia-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit.yml + mochitest: + allowed_build_tasks: + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_mochitests.yml + chunks: 5 + mochitest-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest_oop.yml + chunks: 1 + reftest-sanity-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests_sanity_oop.yml + chunks: 1 diff --git a/testing/taskcluster/tasks/branches/base_job_flags.yml b/testing/taskcluster/tasks/branches/base_job_flags.yml new file mode 100644 index 000000000000..58136214304a --- /dev/null +++ b/testing/taskcluster/tasks/branches/base_job_flags.yml @@ -0,0 +1,44 @@ +--- +# List of all possible flags for each category of tests used in the case where +# "all" is specified. +flags: + builds: + - emulator + - emulator-jb + - emulator-kk + - linux32_gecko # b2g desktop linux 32 bit + - linux64_gecko # b2g desktop linux 64 bit + - linux64-mulet # Firefox desktop - b2g gecko linux 64 bit + - macosx64_gecko # b2g desktop osx 64 bit + - win32_gecko # b2g desktop win 32 bit + + tests: + - cppunit + - crashtest + - crashtest-ipc + - gaia-build + - gaia-build-unit + - gaia-js-integration + - gaia-linter + - gaia-unit + - gaia-unit-oop + - gaia-ui-test-oop + - gaia-ui-test-accessibility + - gaia-ui-test-functional + - gaia-ui-test-unit + - jetpack + - jittests + - jsreftest + - marionette + - marionette-webapi + - mochitest + - mochitest-media + - mochitest-oop + - mozmill + - reftest + - reftest-ipc + - reftest-no-accel + - reftest-sanity-oop + - web-platform-tests + - xpcshell + diff --git a/testing/taskcluster/tasks/branches/cedar/job_flags.yml b/testing/taskcluster/tasks/branches/cedar/job_flags.yml new file mode 100644 index 000000000000..994d50e33e0b --- /dev/null +++ b/testing/taskcluster/tasks/branches/cedar/job_flags.yml @@ -0,0 +1,169 @@ +--- +# For complete sample of all build and test jobs, +# see /testing/taskcluster/tasks/job_flags.yml + +$inherits: + from: tasks/branches/base_job_flags.yml + +builds: + linux64_gecko: + platforms: + - b2g + types: + opt: + task: tasks/builds/b2g_desktop_opt.yml + debug: + task: tasks/builds/b2g_desktop_debug.yml + linux64-mulet: + platforms: + - Mulet Linux + types: + opt: + task: tasks/builds/mulet_linux.yml + emulator-kk: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_kk_opt.yml + debug: + task: tasks/builds/b2g_emulator_kk_debug.yml + emulator-jb: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_jb_opt.yml + debug: + task: tasks/builds/b2g_emulator_jb_debug.yml + emulator: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_ics_opt.yml + debug: + task: tasks/builds/b2g_emulator_ics_debug.yml + +tests: + cppunit: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + crashtest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + gaia-build: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_test.yml + gaia-build-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_unit.yml + gaia-js-integration: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 4 + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 4 + gaia-linter: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_linter.yml + gaia-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit.yml + gaia-ui-test-accessibility: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + gaia-ui-test-functional: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + gaia-ui-test-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + gaia-ui-test-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gip_oop.yml + jsreftest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_js_reftest.yml + chunks: 3 + marionette: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_marionette.yml + marionette-webapi: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + mochitest: + allowed_build_tasks: + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_mochitests.yml + chunks: 5 + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 9 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 20 + tasks/builds/b2g_emulator_jb_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 1 + mochitest-media: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest_media.yml + mochitest-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest_oop.yml + chunks: 1 + reftest: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests.yml + chunks: 10 + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_reftests.yml + chunks: 6 + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 20 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 10 + reftest-sanity-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests_sanity_oop.yml + chunks: 1 + xpcshell: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_xpcshell.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_xpcshell_chunked.yml + chunks: 2 diff --git a/testing/taskcluster/tasks/branches/mozilla-central/job_flags.yml b/testing/taskcluster/tasks/branches/mozilla-central/job_flags.yml new file mode 100644 index 000000000000..26a693850a69 --- /dev/null +++ b/testing/taskcluster/tasks/branches/mozilla-central/job_flags.yml @@ -0,0 +1,141 @@ +--- +# For complete sample of all build and test jobs, +# see /testing/taskcluster/tasks/job_flags.yml + +$inherits: + from: tasks/branches/base_job_flags.yml + +builds: + linux64_gecko: + platforms: + - b2g + types: + opt: + task: tasks/builds/b2g_desktop_opt.yml + debug: + task: tasks/builds/b2g_desktop_debug.yml + linux64-mulet: + platforms: + - Mulet Linux + types: + opt: + task: tasks/builds/mulet_linux.yml + emulator-kk: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_kk_opt.yml + debug: + task: tasks/builds/b2g_emulator_kk_debug.yml + emulator-jb: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_jb_opt.yml + debug: + task: tasks/builds/b2g_emulator_jb_debug.yml + emulator: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_ics_opt.yml + debug: + task: tasks/builds/b2g_emulator_ics_debug.yml + +tests: + cppunit: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + crashtest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + gaia-build: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_test.yml + gaia-build-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_unit.yml + gaia-js-integration: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 4 + gaia-linter: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_linter.yml + gaia-ui-test-accessibility: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + gaia-ui-test-functional: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + gaia-ui-test-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + gaia-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit.yml + marionette: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette.yml + marionette-webapi: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + mochitest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 9 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 20 + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_mochitests.yml + chunks: 5 + mochitest-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest_oop.yml + chunks: 1 + reftest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 20 + reftest-sanity-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests_sanity_oop.yml + chunks: 1 + xpcshell: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_xpcshell.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_xpcshell_chunked.yml + chunks: 2 diff --git a/testing/taskcluster/tasks/branches/try/job_flags.yml b/testing/taskcluster/tasks/branches/try/job_flags.yml new file mode 100644 index 000000000000..ae790db914bf --- /dev/null +++ b/testing/taskcluster/tasks/branches/try/job_flags.yml @@ -0,0 +1,144 @@ +--- +# For complete sample of all build and test jobs, +# see /testing/taskcluster/tasks/job_flags.yml + +$inherits: + from: tasks/branches/base_job_flags.yml + +builds: + linux64_gecko: + platforms: + - b2g + types: + opt: + task: tasks/builds/b2g_desktop_opt.yml + debug: + task: tasks/builds/b2g_desktop_debug.yml + linux64-mulet: + platforms: + - Mulet Linux + types: + opt: + task: tasks/builds/mulet_linux.yml + emulator-kk: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_kk_opt.yml + debug: + task: tasks/builds/b2g_emulator_kk_debug.yml + emulator-jb: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_jb_opt.yml + debug: + task: tasks/builds/b2g_emulator_jb_debug.yml + emulator: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_ics_opt.yml + debug: + task: tasks/builds/b2g_emulator_ics_debug.yml + +tests: + cppunit: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + crashtest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + gaia-build: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_test.yml + gaia-build-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_unit.yml + gaia-js-integration: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 10 + gaia-linter: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_linter.yml + gaia-ui-test-accessibility: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + gaia-ui-test-functional: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + gaia-ui-test-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + gaia-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit.yml + marionette: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette.yml + marionette-webapi: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + mochitest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 9 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 20 + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_mochitests.yml + chunks: 5 + mochitest-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest_oop.yml + chunks: 1 + reftest: + allowed_build_tasks: + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_reftests.yml + chunks: 6 + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 20 + reftest-sanity-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests_sanity_oop.yml + chunks: 1 + xpcshell: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_xpcshell.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_xpcshell_chunked.yml + chunks: 2 diff --git a/testing/taskcluster/tasks/build.yml b/testing/taskcluster/tasks/build.yml new file mode 100644 index 000000000000..d3c67b03ff1c --- /dev/null +++ b/testing/taskcluster/tasks/build.yml @@ -0,0 +1,56 @@ +# This is the "base" task which contains the common values all builds must +# provide. +--- +taskId: {{build_slugid}} + +task: + created: '{{now}}' + deadline: '{{#from_now}}24 hours{{/from_now}}' + metadata: + source: http://todo.com/soon + owner: {{owner}} + + workerType: build-c4-2xlarge + provisionerId: aws-provisioner + schedulerId: task-graph-scheduler + + scopes: + # Nearly all of our build tasks use tc-vcs so just include the scope across + # the board. + - 'docker-worker:cache:tc-vcs' + - 'docker-worker:image:{{#docker_image}}builder{{/docker_image}}' + - 'queue:define-task:aws-provisioner/build-c4-2xlarge' + - 'queue:create-task:aws-provisioner/build-c4-2xlarge' + + + payload: + image: '{{#docker_image}}builder{{/docker_image}}' + + # One hour is a good value for most builds + maxRunTime: 3600 + + cache: + tc-vcs: '/home/worker/.tc-vcs' + + # All builds share a common artifact directory for ease of uploading. + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + + env: + # Common environment variables for checking out gecko + GECKO_BASE_REPOSITORY: '{{base_repository}}' + GECKO_HEAD_REPOSITORY: '{{head_repository}}' + GECKO_HEAD_REV: '{{head_rev}}' + GECKO_HEAD_REF: '{{head_ref}}' + MOZHARNESS_REPOSITORY: '{{mozharness_repository}}' + MOZHARNESS_REV: '{{mozharness_rev}}' + + extra: + treeherder: + groupSymbol: tc + groupName: Submitted by taskcluster + symbol: B diff --git a/testing/taskcluster/tasks/builds/b2g_desktop_base.yml b/testing/taskcluster/tasks/builds/b2g_desktop_base.yml new file mode 100644 index 000000000000..36c90fef024f --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_desktop_base.yml @@ -0,0 +1,39 @@ +$inherits: + from: 'tasks/build.yml' +task: + metadata: + name: "[TC] B2G Desktop {{build_type}}" + description: B2G Desktop {{build_type}} + + scopes: + - 'docker-worker:cache:sources-gecko' + - 'docker-worker:cache:sources-gaia' + - 'docker-worker:cache:build-b2g-desktop-objects' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + sources-gecko: '/home/worker/gecko' + build-b2g-desktop-objects: '/home/worker/object-folder' + + env: + MOZCONFIG: 'b2g/config/mozconfigs/linux64_gecko/nightly' + MOZTT_GIT_URL: '{{moztt_git_url}}' + MOZTT_REVISION: '{{moztt_revision}}' + + command: + - bin/build-b2g-desktop.sh + + extra: + treeherder: + groupSymbol: tc + groupName: Submitted by taskcluster + machine: + platform: b2g-linux64 + + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'public/build/target.linux-x86_64.tar.bz2' + tests: 'public/build/target.tests.zip' diff --git a/testing/taskcluster/tasks/builds/b2g_desktop_debug.yml b/testing/taskcluster/tasks/builds/b2g_desktop_debug.yml new file mode 100644 index 000000000000..4084235ec919 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_desktop_debug.yml @@ -0,0 +1,14 @@ +$inherits: + from: 'tasks/builds/b2g_desktop_base.yml' + variables: + build_type: 'debug' + +task: + extra: + treeherder: + collection: + debug: true + + payload: + env: + MOZCONFIG: 'b2g/config/mozconfigs/linux64_gecko/debug' diff --git a/testing/taskcluster/tasks/builds/b2g_desktop_opt.yml b/testing/taskcluster/tasks/builds/b2g_desktop_opt.yml new file mode 100644 index 000000000000..9075a78a710c --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_desktop_opt.yml @@ -0,0 +1,9 @@ +$inherits: + from: 'tasks/builds/b2g_desktop_base.yml' + variables: + build_type: 'opt' + +task: + payload: + env: + MOZCONFIG: 'b2g/config/mozconfigs/linux64_gecko/nightly' diff --git a/testing/taskcluster/tasks/builds/b2g_dolphin_eng.yml b/testing/taskcluster/tasks/builds/b2g_dolphin_eng.yml new file mode 100644 index 000000000000..3b0f3475089f --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_dolphin_eng.yml @@ -0,0 +1,18 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-dolphin-eng' + metadata: + name: B2G Dolphin Eng + payload: + cache: + build-hamachi-eng: /home/worker/object-folder + env: + TARGET: 'dolphin' + DEBUG: 0 + VARIANT: eng + extra: + locations: + img: 'private/build/dolphin.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_dolphin_user.yml b/testing/taskcluster/tasks/builds/b2g_dolphin_user.yml new file mode 100644 index 000000000000..10a0d0c946ef --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_dolphin_user.yml @@ -0,0 +1,17 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-dolphin-user' + metadata: + name: B2G Dolphin User + payload: + cache: + build-hamachi-user: /home/worker/object-folder + env: + TARGET: 'dolphin' + DEBUG: 0 + extra: + locations: + img: 'private/build/dolphin.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_base.yml b/testing/taskcluster/tasks/builds/b2g_emulator_base.yml new file mode 100644 index 000000000000..cb0f83b8cd55 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_base.yml @@ -0,0 +1,27 @@ +$inherits: + from: 'tasks/build.yml' +task: + metadata: + description: | + Android emulators + b2g environment used in full stack testing. + payload: + env: + TARGET: 'emulator' + B2G_DEBUG: 0 + REPO_TRACE: 1 + + # Emulators can take a very long time to build! + maxRunTime: 14400 + + command: + - build-emulator.sh + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'public/build/emulator.tar.gz' + tests: 'public/build/b2g-tests.zip' + symbols: 'public/build/b2g-crashreporter-symbols.zip' + sources: 'public/build/sources.xml' diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_ics_debug.yml b/testing/taskcluster/tasks/builds/b2g_emulator_ics_debug.yml new file mode 100644 index 000000000000..8750c7987c81 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_ics_debug.yml @@ -0,0 +1,21 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-ics-debug' + metadata: + name: '[TC] B2G Emulator ICS Debug' + extra: + treeherder: + collection: + debug: true + machine: + platform: b2g-emu-ics + + + payload: + cache: + build-emulator-ics-debug: /home/worker/object-folder + env: + TARGET: 'emulator' + B2G_DEBUG: 1 diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_ics_opt.yml b/testing/taskcluster/tasks/builds/b2g_emulator_ics_opt.yml new file mode 100644 index 000000000000..ebeb95679022 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_ics_opt.yml @@ -0,0 +1,20 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-ics-opt' + metadata: + name: '[TC] B2G Emulator ICS Opt' + + extra: + treeherder: + machine: + platform: b2g-emu-ics + + payload: + cache: + build-emulator-ics-opt: /home/worker/object-folder/ + + env: + TARGET: 'emulator' + diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_jb_debug.yml b/testing/taskcluster/tasks/builds/b2g_emulator_jb_debug.yml new file mode 100644 index 000000000000..cfcbbc0dba76 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_jb_debug.yml @@ -0,0 +1,22 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-jb-debug' + metadata: + name: '[TC] B2G Emulator JB Debug' + + extra: + treeherder: + collection: + debug: true + machine: + platform: b2g-emu-jb + + payload: + cache: + build-emulator-jb-debug: /home/worker/object-folder + env: + TARGET: 'emulator-jb' + B2G_DEBUG: 1 + diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_jb_opt.yml b/testing/taskcluster/tasks/builds/b2g_emulator_jb_opt.yml new file mode 100644 index 000000000000..a396c4587889 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_jb_opt.yml @@ -0,0 +1,18 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-jb-opt' + metadata: + name: '[TC] B2G JB Emulator Opt' + + extra: + treeherder: + machine: + platform: b2g-emu-jb + + payload: + cache: + build-emulator-jb-opt: /home/worker/object-folder + env: + TARGET: 'emulator-jb' diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_kk_debug.yml b/testing/taskcluster/tasks/builds/b2g_emulator_kk_debug.yml new file mode 100644 index 000000000000..4bbd63ce35b7 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_kk_debug.yml @@ -0,0 +1,21 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-kk-debug' + metadata: + name: '[TC] B2G Emulator KK Debug' + + extra: + treeherder: + collection: + debug: true + machine: + platform: b2g-emu-kk + + payload: + cache: + build-emulator-jb-debug: /home/worker/object-folder + env: + TARGET: 'emulator-kk' + B2G_DEBUG: 1 diff --git a/testing/taskcluster/tasks/builds/b2g_emulator_kk_opt.yml b/testing/taskcluster/tasks/builds/b2g_emulator_kk_opt.yml new file mode 100644 index 000000000000..811e009b3d94 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_emulator_kk_opt.yml @@ -0,0 +1,19 @@ +$inherits: + from: 'tasks/builds/b2g_emulator_base.yml' +task: + scopes: + - 'docker-worker:cache:build-emulator-kk-opt' + metadata: + name: '[TC] B2G KK Emulator Opt' + + extra: + treeherder: + machine: + platform: b2g-emu-kk + + payload: + cache: + build-emulator-kk-opt: /home/worker/object-folder + env: + TARGET: 'emulator-kk' + diff --git a/testing/taskcluster/tasks/builds/b2g_flame_kk_eng.yml b/testing/taskcluster/tasks/builds/b2g_flame_kk_eng.yml new file mode 100644 index 000000000000..8d2b2d76e22f --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_flame_kk_eng.yml @@ -0,0 +1,24 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-flame-kk-eng' + metadata: + name: '[TC] B2G Flame KK Eng' + + extra: + treeherder: + symbol: Be + groupSymbol: Flame-KK + groupName: Flame KitKat Device Image + machine: + platform: b2g-device-image + + payload: + cache: + build-flame-kk-eng: /home/worker/object-folder + env: + TARGET: 'flame-kk' + DEBUG: 0 + VARIANT: eng + diff --git a/testing/taskcluster/tasks/builds/b2g_flame_kk_opt.yml b/testing/taskcluster/tasks/builds/b2g_flame_kk_opt.yml new file mode 100644 index 000000000000..cbe7785bca4c --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_flame_kk_opt.yml @@ -0,0 +1,24 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-flame-kk-opt' + metadata: + name: '[TC] B2G Flame KK Opt' + + payload: + cache: + build-flame-kk-opt: /home/worker/object-folder + env: + TARGET: 'flame-kk' + DEBUG: 0 + extra: + treeherder: + symbol: B + groupSymbol: Flame-KK + groupName: Flame KitKat Device Image + machine: + platform: b2g-device-image + locations: + img: 'private/build/flame-kk.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_hamachi_eng.yml b/testing/taskcluster/tasks/builds/b2g_hamachi_eng.yml new file mode 100644 index 000000000000..5971e9bcff39 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_hamachi_eng.yml @@ -0,0 +1,18 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-hamachi-eng' + metadata: + name: B2G Hamachi Eng + payload: + cache: + build-hamachi-eng: /home/worker/object-folder + env: + TARGET: 'hamachi' + DEBUG: 0 + VARIANT: 'eng' + extra: + locations: + img: 'private/build/hamachi.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_hamachi_user.yml b/testing/taskcluster/tasks/builds/b2g_hamachi_user.yml new file mode 100644 index 000000000000..b41b91ddb213 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_hamachi_user.yml @@ -0,0 +1,17 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-hamachi-user' + metadata: + name: B2G Hamachi User + payload: + cache: + build-hamachi-user: /home/worker/object-folder + env: + TARGET: 'hamachi' + DEBUG: 0 + extra: + locations: + img: 'private/build/hamachi.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_helix_user.yml b/testing/taskcluster/tasks/builds/b2g_helix_user.yml new file mode 100644 index 000000000000..8841fd2d2360 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_helix_user.yml @@ -0,0 +1,17 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-helix-user' + metadata: + name: B2G Helix User + payload: + cache: + build-hamachi-user: /home/worker/object-folder + env: + TARGET: 'helix' + DEBUG: 0 + extra: + locations: + img: 'private/build/helix.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_nexus4_eng.yml b/testing/taskcluster/tasks/builds/b2g_nexus4_eng.yml new file mode 100644 index 000000000000..494d4c587d7b --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_nexus4_eng.yml @@ -0,0 +1,17 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-nexus-4-eng' + metadata: + name: B2G Nexus 4 Eng + payload: + cache: + build-nexus-4-eng: /home/worker/object-folder + env: + TARGET: 'nexus-4' + DEBUG: 0 + extra: + locations: + img: 'private/build/nexus-4.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_nexus4_user.yml b/testing/taskcluster/tasks/builds/b2g_nexus4_user.yml new file mode 100644 index 000000000000..2f13f39c8e82 --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_nexus4_user.yml @@ -0,0 +1,24 @@ +$inherits: + from: 'tasks/builds/b2g_phone_base.yml' +task: + scopes: + - 'docker-worker:cache:build-nexus-4-user' + metadata: + name: '[TC] B2G Nexus 4 User' + + payload: + cache: + build-nexus-4-user: /home/worker/object-folder + env: + TARGET: 'nexus-4' + DEBUG: 0 + extra: + treeherder: + symbol: B + groupSymbol: Nexus4 + groupName: Nexus4 Device Image + machine: + platform: b2g-device-image + locations: + img: 'private/build/nexus-4.zip' + diff --git a/testing/taskcluster/tasks/builds/b2g_phone_base.yml b/testing/taskcluster/tasks/builds/b2g_phone_base.yml new file mode 100644 index 000000000000..19a05a8d0e1d --- /dev/null +++ b/testing/taskcluster/tasks/builds/b2g_phone_base.yml @@ -0,0 +1,27 @@ +$inherits: + from: 'tasks/phone_build.yml' +task: + metadata: + description: | + Android phones + b2g environment used in full stack testing. + payload: + env: + REPO_TRACE: 1 + VARIANT: user + + # Emulators can take a very long time to build! + maxRunTime: 14400 + + command: + - build-phone.sh + + extra: + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'private/build/b2g-android-arm.tar.gz' + tests: 'private/build/gaia.zip' + symbols: 'private/build/b2g-crashreporter-symbols.zip' + sources: 'private/build/sources.xml' + diff --git a/testing/taskcluster/tasks/builds/mulet_linux.yml b/testing/taskcluster/tasks/builds/mulet_linux.yml new file mode 100644 index 000000000000..783791a22c52 --- /dev/null +++ b/testing/taskcluster/tasks/builds/mulet_linux.yml @@ -0,0 +1,36 @@ +$inherits: + from: 'tasks/build.yml' +task: + metadata: + name: '[TC] Mulet Linux x64 Opt' + description: Mulet Linux x64 Opt + + scopes: + - 'docker-worker:cache:sources-gecko' + - 'docker-worker:cache:build-mulet-linux-objects' + - 'docker-worker:cache:tooltool-cache' + + payload: + cache: + sources-gecko: '/home/worker/gecko' + build-mulet-linux-objects: '/home/worker/object-folder' + tooltool-cache: '/home/worker/tools/tooltool-cache' + + env: + MOZCONFIG: 'b2g/dev/config/mozconfigs/linux64/mulet' + + maxRunTime: 3600 + + command: + - bin/build-mulet-linux.sh + + extra: + treeherder: + machine: + platform: mulet-linux64 + # Rather then enforcing particular conventions we require that all build + # tasks provide the "build" extra field to specify where the build and tests + # files are located. + locations: + build: 'public/build/target.linux-x86_64.tar.bz2' + tests: 'public/build/target.tests.zip' diff --git a/testing/taskcluster/tasks/decision/branch.yml b/testing/taskcluster/tasks/decision/branch.yml new file mode 100644 index 000000000000..50a53b30e2be --- /dev/null +++ b/testing/taskcluster/tasks/decision/branch.yml @@ -0,0 +1,90 @@ +--- +metadata: + name: 'Task graph used to build {{project}} specific jobs' + description: | + {{project}} push for {{owner}} with comment: {{comment}}. + owner: "{{owner}}" + source: "{{source}}" + +scopes: + - "docker-worker:image:quay.io/mozilla/decision:*" + - "queue:define-task:aws-provisioner/gecko-decision" + - "queue:create-task:aws-provisioner/gecko-decision" + - "docker-worker:cache:tc-vcs-public-sources" + - "docker-worker:cache:build-emulator-jb-opt" + - "docker-worker:cache:build-mulet-linux-objects" + - "docker-worker:cache:build-emulator-ics-opt" + - "queue:define-task:aws-provisioner/b2gtest" + - "queue:create-task:aws-provisioner/b2gtest" + - "docker-worker:image:quay.io/mozilla/builder:*" + - "docker-worker:cache:tooltool-cache" + - "queue:define-task:aws-provisioner/b2gbuild" + - "queue:create-task:aws-provisioner/b2gbuild" + - "docker-worker:cache:build-emulator-kk-debug" + - "docker-worker:cache:build-b2g-desktop-objects" + - "docker-worker:cache:build-emulator-kk-opt" + - "docker-worker:cache:build-emulator-jb-debug" + - "docker-worker:cache:tc-vcs" + - "docker-worker:cache:sources-gecko" + - "docker-worker:cache:sources-gaia" + - "docker-worker:cache:build-emulator-ics-debug" +tasks: + - taskId: '{{#as_slugid}}decision task{{/as_slugid}}' + task: + created: '{{now}}' + deadline: '{{#from_now}}1 day{{/from_now}}' + metadata: + source: {{source}} + owner: {{owner}} + name: Initial decision task for {{project}} specific graphs + description: | + This is the single most important task as it decides how all other tasks + get built. + + workerType: "gecko-decision" + provisionerId: "aws-provisioner" + + scopes: + - "docker-worker:cache:tc-vcs-public-sources" + - "docker-worker:image:quay.io/mozilla/decision:0.0.3" + + payload: + env: + GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-central' + GECKO_HEAD_REPOSITORY: '{{url}}' + GECKO_HEAD_REF: '{{revision}}' + GECKO_HEAD_REV: '{{revision}}' + + cache: + # The taskcluster-vcs tooling stores the large clone caches in this + # directory and will reuse them for new requests this saves about 20s~ and + # is the most generic cache possible. + tc-vcs-public-sources: '/home/worker/.tc-vcs/' + + # Note: This task is built server side without the context or tooling that + # exist in tree so we must hard code the version + image: 'quay.io/mozilla/decision:0.0.3' + + # Virtually no network or other potentially risky operations happen as part + # of the task timeout aside from the initial clone. We intentionally have + # set this to a lower value _all_ decision tasks should use a root + # repository which is cached. + maxRunTime: 1800 + + command: + - /bin/bash + - -cx + - > + source $(which entrypoint) && + ./mach taskcluster-graph + --message='{{comment}}' + --project='{{project}}' + --owner='{{owner}}' + --extend-graph > /home/worker/graph.json + graphs: + - /home/worker/graph.json + + extra: + treeherder: + symbol: D + diff --git a/testing/taskcluster/tasks/decision/periodic_alder.yml b/testing/taskcluster/tasks/decision/periodic_alder.yml new file mode 100644 index 000000000000..b23bdd9b438f --- /dev/null +++ b/testing/taskcluster/tasks/decision/periodic_alder.yml @@ -0,0 +1,43 @@ +taskId: '{{ "decision task" | as-slugid }}' +task: + created: '{{now}}' + deadline: '{{ "1 day" | from-now }}' + metadata: + source: '{{source}}' + owner: '{{owner}}' + name: 'Taskcluster decision task for {{project}}' + description: | + Decision task for testing purposes for alder. + + workerType: gecko-decision + provisionerId: aws-provisioner + + scopes: + - 'docker-worker:cache:tc-vcs-public-sources' + + payload: + cache: + # The taskcluster-vcs tooling stores the large clone caches in this + # directory and will reuse them for new requests this saves about 20s~ and + # is the most generic cache possible. + tc-vcs-public-sources: '/home/worker/.tc-vcs/' + + # Note: This task is built server side without the context or tooling that + # exist in tree so we must hard code the version + image: 'quay.io/mozilla/decision:0.0.3' + + # Virtually no network or other potentially risky operations happen as part + # of the task timeout aside from the initial clone. We intentionally have + # set this to a lower value _all_ decision tasks should use a root + # repository which is cached. + maxRunTime: 1800 + + command: + - /bin/bash + - -c + - echo "test: {{comment}} ({{revision}}) for {{owner}}" + graphs: + - /home/worker/graph.json + extra: + treeherder: + symbol: D diff --git a/testing/taskcluster/tasks/decision/try.yml b/testing/taskcluster/tasks/decision/try.yml new file mode 100644 index 000000000000..14189b858c55 --- /dev/null +++ b/testing/taskcluster/tasks/decision/try.yml @@ -0,0 +1,94 @@ +--- +metadata: + name: 'Taskcluster decision task for {{project}}' + description: | + Try push for {{owner}} with {{comment}}. + owner: "{{owner}}" + source: "{{{source}}}" + +scopes: + - "queue:define-task:aws-provisioner/gecko-decision" + - "queue:create-task:aws-provisioner/gecko-decision" + - "docker-worker:cache:*" + - "docker-worker:image:quay.io/mozilla/decision:0.0.3" + - "queue:route:tc-treeherder-stage.{{project}}.{{revision_hash}}" + - "queue:route:tc-treeherder.{{project}}.{{revision_hash}}" + - 'queue:define-task:aws-provisioner/test-c4-2xlarge' + - 'queue:create-task:aws-provisioner/test-c4-2xlarge' + - 'queue:define-task:aws-provisioner/build-c4-2xlarge' + - 'queue:create-task:aws-provisioner/build-c4-2xlarge' + - "docker-worker:cache:tc-vcs" + - "docker-worker:image:quay.io/mozilla/builder:0.0.30" + - "queue:define-task:aws-provisioner/build-c4-2xlarge" + - "queue:create-task:aws-provisioner/build-c4-2xlarge" + - "docker-worker:cache:sources-gecko" + - "docker-worker:cache:build-mulet-linux-objects" + - "docker-worker:cache:tooltool-cache" + - "docker-worker:image:quay.io/mozilla/tester:0.0.9" + +tasks: + - taskId: '{{#as_slugid}}decision task{{/as_slugid}}' + task: + created: '{{now}}' + deadline: '{{#from_now}}1 day{{/from_now}}' + metadata: + source: {{{source}}} + owner: {{owner}} + name: "[tc] Initial decision task for try ({{comment}})" + description: | + This is the single most important task as it decides how all other tasks + get built. + + workerType: "gecko-decision" + provisionerId: "aws-provisioner" + + scopes: + - "docker-worker:cache:tc-vcs-public-sources" + - "docker-worker:image:quay.io/mozilla/decision:0.0.3" + - "queue:route:tc-treeherder-stage.{{project}}.{{revision_hash}}" + - "queue:route:tc-treeherder.{{project}}.{{revision_hash}}" + + routes: + - "tc-treeherder-stage.{{project}}.{{revision_hash}}" + + payload: + env: + GECKO_BASE_REPOSITORY: 'https://hg.mozilla.org/mozilla-central' + GECKO_HEAD_REPOSITORY: '{{{url}}}' + GECKO_HEAD_REF: '{{revision}}' + GECKO_HEAD_REV: '{{revision}}' + + cache: + # The taskcluster-vcs tooling stores the large clone caches in this + # directory and will reuse them for new requests this saves about 20s~ and + # is the most generic cache possible. + tc-vcs-public-sources: '/home/worker/.tc-vcs/' + + # Note: This task is built server side without the context or tooling that + # exist in tree so we must hard code the version + image: 'quay.io/mozilla/decision:0.0.3' + + # Virtually no network or other potentially risky operations happen as part + # of the task timeout aside from the initial clone. We intentionally have + # set this to a lower value _all_ decision tasks should use a root + # repository which is cached. + maxRunTime: 1800 + + command: + - /bin/bash + - -cx + - > + source $(which entrypoint) && + ./mach taskcluster-graph + --project='{{project}}' + --message='{{comment}}' + --owner='{{owner}}' + --revision-hash='{{revision_hash}}' + --extend-graph > /home/worker/graph.json + graphs: + - /home/worker/graph.json + + extra: + treeherder: + symbol: D + diff --git a/testing/taskcluster/tasks/job_flags.yml b/testing/taskcluster/tasks/job_flags.yml new file mode 100644 index 000000000000..3be915c06e36 --- /dev/null +++ b/testing/taskcluster/tasks/job_flags.yml @@ -0,0 +1,251 @@ +# This file contains the list of "job flags"/"try flags" for tests and builds. +--- + +# List of all possible flags for each category of tests used in the case where +# "all" is specified. +flags: + builds: + - emulator + - emulator-jb + - emulator-kk + - linux32_gecko # b2g desktop linux 32 bit + - linux64_gecko # b2g desktop linux 64 bit + - linux64-mulet # Firefox desktop - b2g gecko linux 64 bit + - macosx64_gecko # b2g desktop osx 64 bit + - win32_gecko # b2g desktop win 32 bit + + tests: + - cppunit + - crashtest + - crashtest-ipc + - gaia-build + - gaia-build-unit + - gaia-js-integration + - gaia-linter + - gaia-unit + - gaia-unit-oop + - gaia-ui-test-oop + - gaia-ui-test-accessibility + - gaia-ui-test-functional + - gaia-ui-test-unit + - jetpack + - jittests + - jsreftest + - marionette + - marionette-webapi + - mochitest + - mochitest-media + - mochitest-oop + - mozmill + - reftest + - reftest-ipc + - reftest-no-accel + - reftest-sanity-oop + - web-platform-tests + - xpcshell + +# Build section covers the -b[uild] and -p[latform] options that try provides. +builds: + # The format for registering a new build flag -> task looks like this: + # + # + # # Platforms are primarily used to restrict test runs to only X platform + # # but the information is stored on the build to indicate which platform(s) + # # the build belongs to. Note that `platforms` here is the term used by the + # # try chooser meaning "some group of tests" examples of platforms are + # # things like "b2g", "win32" + # platforms: + # - + # # note that for sanity o -> means opt and d -> means debug if additional + # # flags are passed we will attempt to match them up to an option here if + # # available + # types: + # opt: + # debug: + # + linux64_gecko: + platforms: + - b2g + types: + opt: + task: tasks/builds/b2g_desktop_opt.yml + debug: + task: tasks/builds/b2g_desktop_debug.yml + linux64-mulet: + platforms: + - Mulet Linux + types: + opt: + task: tasks/builds/mulet_linux.yml + emulator-kk: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_kk_opt.yml + debug: + task: tasks/builds/b2g_emulator_kk_debug.yml + emulator-jb: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_jb_opt.yml + debug: + task: tasks/builds/b2g_emulator_jb_debug.yml + emulator: + platfoms: + - b2g + types: + opt: + task: tasks/builds/b2g_emulator_ics_opt.yml + debug: + task: tasks/builds/b2g_emulator_ics_debug.yml + +# Test section covers the -u options in the try flags +tests: + # The format for registering a new test flag -> task looks like this: + # + # + # task: + # # Note that total number of chunks effects more then just performance we + # # need to schedule specific chunks in some cases! + # chunks: + # # Not all tests can run on all builds and we may not want to run some + # # tests on all build variants so we use "allowed tasks" instead of + # # "allowed platforms" here. + # allowed_build_tasks: + # - builds/b2g_desktop_opt.yml + cppunit: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_cpp_unit.yml + crashtest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_crashtest.yml + chunks: 3 + gaia-build: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_test.yml + gaia-build-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_build_unit.yml + gaia-js-integration: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 10 + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_gaia_js_integration_tests.yml + chunks: 10 + gaia-linter: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_linter.yml + gaia-ui-test-accessibility: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_accessibility.yml + tasks/builds/b2g_emulator.yml: + task: tasks/tests/b2g_emulator_gaia_ui_test_accessibility.yml + gaia-ui-test-functional: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_functional.yml + chunks: 3 + gaia-ui-test-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gip_oop.yml + gaia-ui-test-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_ui_test_unit.yml + gaia-unit: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit.yml + gaia-unit-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_gaia_unit_oop.yml + jsreftest: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_js_reftest.yml + chunks: 3 + marionette: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_marionette.yml + marionette-webapi: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_marionette_webapi.yml + mochitest: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest.yml + chunks: 5 + tasks/builds/b2g_desktop_debug.yml: + task: tasks/tests/b2g_mochitest.yml + chunks: 5 + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_mochitests.yml + chunks: 5 + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 9 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 20 + tasks/builds/b2g_emulator_jb_opt.yml: + task: tasks/tests/b2g_emulator_mochitest.yml + chunks: 1 + mochitest-media: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_mochitest_media.yml + mochitest-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_mochitest_oop.yml + chunks: 1 + reftest: + allowed_build_tasks: + tasks/builds/mulet_linux.yml: + task: tasks/tests/mulet_reftests.yml + chunks: 6 + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests.yml + chunks: 10 + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 20 + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_reftest.yml + chunks: 10 + reftest-sanity-oop: + allowed_build_tasks: + tasks/builds/b2g_desktop_opt.yml: + task: tasks/tests/b2g_reftests_sanity_oop.yml + chunks: 1 + xpcshell: + allowed_build_tasks: + tasks/builds/b2g_emulator_ics_opt.yml: + task: tasks/tests/b2g_emulator_xpcshell.yml + tasks/builds/b2g_emulator_ics_debug.yml: + task: tasks/tests/b2g_emulator_xpcshell_chunked.yml + chunks: 2 diff --git a/testing/taskcluster/tasks/phone_build.yml b/testing/taskcluster/tasks/phone_build.yml new file mode 100644 index 000000000000..7ce780eed55c --- /dev/null +++ b/testing/taskcluster/tasks/phone_build.yml @@ -0,0 +1,50 @@ +# This is the "base" task which contains the common values all builds must +# provide. +--- +taskId: {{build_slugid}} + +task: + created: '{{now}}' + deadline: '{{#from_now}}24 hours{{/from_now}}' + metadata: + source: http://todo.com/soon + owner: {{owner}} + + workerType: b2gbuild + provisionerId: aws-provisioner + + scopes: + # Nearly all of our build tasks use tc-vcs so just include the scope across + # the board. + - 'docker-worker:cache:tc-vcs' + - 'docker-worker:image:{{#docker_image}}phone-builder{{/docker_image}}' + + payload: + image: '{{#docker_image}}phone-builder{{/docker_image}}' + + # One hour is a good value for most builds + maxRunTime: 3600 + + cache: + tc-vcs: '/home/worker/.tc-vcs' + + # All builds share a common artifact directory for ease of uploading. + artifacts: + 'private/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + + env: + # Common environment variables for checking out gecko + GECKO_BASE_REPOSITORY: '{{base_repository}}' + GECKO_HEAD_REPOSITORY: '{{head_repository}}' + GECKO_HEAD_REV: '{{head_rev}}' + GECKO_HEAD_REF: '{{head_ref}}' + MOZHARNESS_REPOSITORY: '{{mozharness_repository}}' + MOZHARNESS_REV: '{{mozharness_rev}}' + + extra: + treeherder: + symbol: B diff --git a/testing/taskcluster/tasks/test.yml b/testing/taskcluster/tasks/test.yml new file mode 100644 index 000000000000..2a76e94753e5 --- /dev/null +++ b/testing/taskcluster/tasks/test.yml @@ -0,0 +1,24 @@ +# This task is the base for most tests in gecko. +task: + created: '{{now}}' + deadline: '{{#from_now}}24 hours{{/from_now}}' + metadata: + source: http://todo.com/soon + owner: {{owner}} + workerType: test-c4-2xlarge + provisionerId: aws-provisioner + schedulerId: task-graph-scheduler + + scopes: + - 'docker-worker:image:{{#docker_image}}tester{{/docker_image}}' + - 'queue:define-task:aws-provisioner/test-c4-2xlarge' + - 'queue:create-task:aws-provisioner/test-c4-2xlarge' + + payload: + image: '{{#docker_image}}tester{{/docker_image}}' + maxRunTime: 3600 + + extra: + treeherder: + groupSymbol: tc + groupName: Submitted by taskcluster diff --git a/testing/taskcluster/tasks/tests/b2g_build_test.yml b/testing/taskcluster/tasks/tests/b2g_build_test.yml new file mode 100644 index 000000000000..8460c14ea8f8 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_build_test.yml @@ -0,0 +1,39 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Build Test' + description: Gaia Build Test test run + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_build_integration.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/gaia_integration_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + symbol: 'Gb' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_build_unit.yml b/testing/taskcluster/tasks/tests/b2g_build_unit.yml new file mode 100644 index 000000000000..5edf54a5380e --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_build_unit.yml @@ -0,0 +1,38 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Build Unit Test' + description: Gaia Build Unit Test + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_build_unit.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/gaia_integration_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --download-symbols ondemand + --installer-url {{build_url}} + --test-url {{tests_url}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + symbol: 'Gbu' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_cpp_unit.yml b/testing/taskcluster/tasks/tests/b2g_emulator_cpp_unit.yml new file mode 100644 index 000000000000..7ca464c76bfc --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_cpp_unit.yml @@ -0,0 +1,32 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] CPP Unit Tests' + description: CPP Unit Tests test run + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite cppunittest + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: CPP Unit Tests + symbol: 'Cpp' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_crashtest.yml b/testing/taskcluster/tasks/tests/b2g_emulator_crashtest.yml new file mode 100644 index 000000000000..83b8964b2b7e --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_crashtest.yml @@ -0,0 +1,36 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Crashtest' + description: Crashtest test run {{chunk}} + + payload: + maxRunTime: 3600 + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite crashtest + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest + groupSymbol: tc-R + symbol: 'C{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_js_reftest.yml b/testing/taskcluster/tasks/tests/b2g_emulator_js_reftest.yml new file mode 100644 index 000000000000..a973ad919b5b --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_js_reftest.yml @@ -0,0 +1,35 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] JSReftest' + description: JSReftest test run {{chunk}} + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite jsreftest + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest + groupSymbol: tc-R + symbol: 'J{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_marionette.yml b/testing/taskcluster/tasks/tests/b2g_emulator_marionette.yml new file mode 100644 index 000000000000..fd1c9e913b23 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_marionette.yml @@ -0,0 +1,30 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Marionette Framework Unit Tests' + description: Marionette Framework Unit Tests test run + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file ./mozharness/configs/marionette/automation_emulator_config.py + --config-file ./mozharness_configs/remove_executables.py + --download-symbols ondemand + --installer-url {{build_url}} + --test-url {{tests_url}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Marionette Framework Unit Tests + symbol: Mn + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_marionette_webapi.yml b/testing/taskcluster/tasks/tests/b2g_emulator_marionette_webapi.yml new file mode 100644 index 000000000000..a124b1d856e8 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_marionette_webapi.yml @@ -0,0 +1,31 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Marionette WebAPI Tests' + description: Marionette WebAPI test run + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file ./mozharness/configs/marionette/automation_emulator_config.py + --config-file ./mozharness_configs/remove_executables.py + --download-symbols ondemand + --test-manifest webapi-tests.ini + --installer-url {{build_url}} + --test-url {{tests_url}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Marionette WebAPI Tests + symbol: Mnw + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_mochitest.yml b/testing/taskcluster/tasks/tests/b2g_emulator_mochitest.yml new file mode 100644 index 000000000000..e92de355205f --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_mochitest.yml @@ -0,0 +1,37 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Mochitest' + description: Mochitest test run {{chunk}} + + payload: + maxRunTime: 7200 + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite mochitest + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Mochitest + groupSymbol: tc-M + symbol: '{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_mochitest_media.yml b/testing/taskcluster/tasks/tests/b2g_emulator_mochitest_media.yml new file mode 100644 index 000000000000..5ce954141218 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_mochitest_media.yml @@ -0,0 +1,35 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Mochitest' + description: Mochitest Media test run + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite mochitest + --test-path dom/media/tests/ + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Mochitest + groupSymbol: tc-M + symbol: M + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_reftest.yml b/testing/taskcluster/tasks/tests/b2g_emulator_reftest.yml new file mode 100644 index 000000000000..e9329f578041 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_reftest.yml @@ -0,0 +1,35 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Reftest' + description: Reftest test run {{chunk}} + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite reftest + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest + groupSymbol: tc-R + symbol: 'R{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell.yml b/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell.yml new file mode 100644 index 000000000000..f02581d790a1 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell.yml @@ -0,0 +1,32 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] XPCShell' + description: XPCShell test run + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite xpcshell + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: XPCShell + symbol: X + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell_chunked.yml b/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell_chunked.yml new file mode 100644 index 000000000000..27b74f067ba3 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_emulator_xpcshell_chunked.yml @@ -0,0 +1,34 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] XPCShell' + description: XPCShell test run {{chunk}} + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_emulator_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/emulator_automation_config.py + --config-file ./mozharness_configs/emulator_override.py + --download-symbols ondemand + --test-suite xpcshell + --installer-url {{build_url}} + --test-url {{tests_url}} + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre_linux_x86.zip + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: XPCShell + symbol: X{{chunk}} + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_js_integration_tests.yml b/testing/taskcluster/tasks/tests/b2g_gaia_js_integration_tests.yml new file mode 100644 index 000000000000..86b3eb20db25 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_js_integration_tests.yml @@ -0,0 +1,42 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia JS Integration Test' + description: Gaia JS Integration Test run {{chunk}} + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_integration.py + --no-read-buildbot-config + --config-file b2g/gaia_integration_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --total-chunk {{total_chunks}} + --this-chunk {{chunk}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Gaia JS Integration Test + groupSymbol: tc-Gij + symbol: '{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_accessibility.yml b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_accessibility.yml new file mode 100644 index 000000000000..254fa8e0c317 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_accessibility.yml @@ -0,0 +1,42 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Python Accessibility Integration Tests' + description: Gaia Python Accessibility Integration Tests run {{chunk}} + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file marionette/gaia_ui_test_prod_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --gip-suite accessibility + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Gaia Python Integration Tests + groupSymbol: tc-Gip + symbol: 'a' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_functional.yml b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_functional.yml new file mode 100644 index 000000000000..f7866968700d --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_functional.yml @@ -0,0 +1,44 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Python Functional Integration Tests' + description: Gaia Python Functional Integration Tests run {{chunk}} + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file marionette/gaia_ui_test_prod_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --gip-suite functional + --total-chunk {{total_chunks}} + --this-chunk {{chunk}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Gaia Python Integration Tests + groupSymbol: tc-Gip + symbol: 'f{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_unit.yml b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_unit.yml new file mode 100644 index 000000000000..75847aa2a74e --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_ui_test_unit.yml @@ -0,0 +1,42 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Python Integration Unit Tests' + description: Gaia Python Integration Unit Tests run {{chunk}} + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file marionette/gaia_ui_test_prod_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --gip-suite unit + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Gaia Python Integration Tests + groupSymbol: tc-Gip + symbol: 'u' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_unit.yml b/testing/taskcluster/tasks/tests/b2g_gaia_unit.yml new file mode 100644 index 000000000000..f4b126878029 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_unit.yml @@ -0,0 +1,39 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Unit Test' + description: Gaia Unit Test + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_unit.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/gaia_unit_production_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --download-symbols ondemand + --installer-url {{build_url}} + --test-url {{tests_url}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + symbol: 'Gu' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gaia_unit_oop.yml b/testing/taskcluster/tasks/tests/b2g_gaia_unit_oop.yml new file mode 100644 index 000000000000..209d57fbdc4e --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gaia_unit_oop.yml @@ -0,0 +1,40 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Unit Test OOP' + description: Gaia Unit Test OOP + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_unit.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/gaia_unit_production_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --browser-arg -oop + --download-symbols ondemand + --installer-url {{build_url}} + --test-url {{tests_url}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + symbol: 'Gu-oop' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_gip_oop.yml b/testing/taskcluster/tasks/tests/b2g_gip_oop.yml new file mode 100644 index 000000000000..b2c2370cca7a --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_gip_oop.yml @@ -0,0 +1,42 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Python Integration Tests OOP' + description: Gaia Python Functional Integration Tests OOP test run + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + + command: + - entrypoint # entrypoint ensures we are running in xvfb + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/marionette.py + --no-read-buildbot-config + --config-file marionette/gaia_ui_test_prod_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --app-arg -oop + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + --xre-url https://s3-us-west-2.amazonaws.com/test-caching/packages/xre.linux-x86_64.zip + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Gaia Python Integration Tests OOP + groupSymbol: tc-Gip-oop + symbol: 'Gip-oop' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_linter.yml b/testing/taskcluster/tasks/tests/b2g_linter.yml new file mode 100644 index 000000000000..926c9b04e1cb --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_linter.yml @@ -0,0 +1,36 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Gaia Linter' + description: Linter Test + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + command: + - entrypoint + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/gaia_linter.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/gaia_integration_config.py + --config-file ./mozharness_configs/gaia_integration_override.py + --download-symbols ondemand + --installer-url {{build_url}} + --test-url {{tests_url}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + symbol: 'Li' + productName: 'b2g' diff --git a/testing/taskcluster/tasks/tests/b2g_mochitest.yml b/testing/taskcluster/tasks/tests/b2g_mochitest.yml new file mode 100644 index 000000000000..10f72ad66c4e --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_mochitest.yml @@ -0,0 +1,33 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] B2G Mochitests {{chunk}}' + description: B2G Desktop Mochi test run {{chunk}} + + payload: + command: + - entrypoint # entrypoint ensures we are running in xvfb + - > + python ./mozharness/scripts/b2g_desktop_unittest.py + --no-read-buildbot-config + --config-file /home/worker/b2g-desktop-config.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --test-suite mochitest + --total-chunk={{total_chunks}} + --this-chunk={{chunk}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Mochitest + groupSymbol: tc-M + symbol: {{chunk}} + diff --git a/testing/taskcluster/tasks/tests/b2g_mochitest_oop.yml b/testing/taskcluster/tasks/tests/b2g_mochitest_oop.yml new file mode 100644 index 000000000000..125978c05f65 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_mochitest_oop.yml @@ -0,0 +1,35 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Mochitest OOP' + description: Mochitest OOP test run {{chunk}} + + payload: + command: + - entrypoint # entrypoint ensures we are running in xvfb + - > + python ./mozharness/scripts/b2g_desktop_unittest.py + --no-read-buildbot-config + --config-file b2g/desktop_automation_config.py + --config-file ./mozharness_configs/remove_executables.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --test-suite mochitest + --total-chunk={{total_chunks}} + --this-chunk={{chunk}} + --browser-arg -oop + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Mochitest OOP + groupSymbol: tc-M-oop + symbol: '{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_reftests.yml b/testing/taskcluster/tasks/tests/b2g_reftests.yml new file mode 100644 index 000000000000..fb65fa414f01 --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_reftests.yml @@ -0,0 +1,34 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Reftest' + description: Reftest test run {{chunk}} + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_desktop_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/desktop_automation_config.py + --config-file ./mozharness_configs/remove_executables.py + --download-symbols ondemand + --test-suite reftest + --installer-url {{build_url}} + --test-url {{tests_url}} + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest + groupSymbol: tc-R + symbol: 'R{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/b2g_reftests_sanity_oop.yml b/testing/taskcluster/tasks/tests/b2g_reftests_sanity_oop.yml new file mode 100644 index 000000000000..e1a5a652077d --- /dev/null +++ b/testing/taskcluster/tasks/tests/b2g_reftests_sanity_oop.yml @@ -0,0 +1,36 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Reftest Sanity OOP' + description: Reftest Sanity OOP test run {{chunk}} + + payload: + command: + - entrypoint + - > + python ./mozharness/scripts/b2g_desktop_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/desktop_automation_config.py + --config-file ./mozharness_configs/remove_executables.py + --download-symbols ondemand + --test-suite reftest + --test-manifest tests/layout/reftests/reftest-sanity/reftest.list + --browser-arg -oop + --installer-url {{build_url}} + --test-url {{tests_url}} + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest Sanity OOP + groupSymbol: tc-Rs-oop + symbol: 'Rs-oop' + productName: b2g diff --git a/testing/taskcluster/tasks/tests/mulet_mochitests.yml b/testing/taskcluster/tasks/tests/mulet_mochitests.yml new file mode 100644 index 000000000000..afdafeb36fdc --- /dev/null +++ b/testing/taskcluster/tasks/tests/mulet_mochitests.yml @@ -0,0 +1,34 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Mulet Mochitests {{chunk}}' + description: Mulet Mochi test run {{chunk}} + + payload: + command: + - entrypoint # entrypoint ensures we are running in xvfb + - > + python ./mozharness/scripts/desktop_unittest.py + --no-read-buildbot-config + --config-file ./mozharness/configs/unittests/linux_unittest.py + --config-file ./mozharness_configs/linux_mulet_config.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --mochitest-suite plain-chunked + --total-chunk={{total_chunks}} + --this-chunk={{chunk}} + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + group_symbol: M + group_name: Mulet mochitests + symbol: {{chunk}} + diff --git a/testing/taskcluster/tasks/tests/mulet_reftests.yml b/testing/taskcluster/tasks/tests/mulet_reftests.yml new file mode 100644 index 000000000000..46a9ab7a0e1f --- /dev/null +++ b/testing/taskcluster/tasks/tests/mulet_reftests.yml @@ -0,0 +1,45 @@ +--- +$inherits: + from: 'tasks/test.yml' +task: + metadata: + name: '[TC] Reftest' + description: Reftest test run {{chunk}} + + scopes: + - 'docker-worker:cache:sources-gaia' + + payload: + cache: + sources-gaia: '/home/worker/gaia' + env: + MOZ_DISABLE_NONLOCAL_CONNECTIONS: 0 + command: + - entrypoint + - ./bin/pull_gaia.sh && + - > + python ./mozharness/scripts/mulet_unittest.py --no-read-buildbot-config + --config-file ./mozharness/configs/b2g/generic_config.py + --config-file ./mozharness/configs/b2g/mulet_config.py + --config-file ./mozharness_configs/remove_executables.py + --installer-url {{build_url}} + --test-url {{tests_url}} + --download-symbols ondemand + --test-suite reftest + --test-manifest tests/layout/reftests/reftest.list + --this-chunk {{chunk}} + --total-chunk {{total_chunks}} + --gaia-repo https://hg.mozilla.org/integration/gaia-central + --gaia-dir /home/worker/gaia + artifacts: + 'public/build': + type: directory + path: '/home/worker/artifacts/' + expires: '{{#from_now}}1 year{{/from_now}}' + + extra: + treeherder: + groupName: Reftest + groupSymbol: tc-R + symbol: 'R{{chunk}}' + productName: b2g diff --git a/testing/taskcluster/tests/fixtures/child_pass.yml b/testing/taskcluster/tests/fixtures/child_pass.yml new file mode 100644 index 000000000000..41ae3bee0154 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/child_pass.yml @@ -0,0 +1,4 @@ +values: + - {{a}} + - {{b}} + - {{c}} diff --git a/testing/taskcluster/tests/fixtures/circular.yml b/testing/taskcluster/tests/fixtures/circular.yml new file mode 100644 index 000000000000..c574e2a1486a --- /dev/null +++ b/testing/taskcluster/tests/fixtures/circular.yml @@ -0,0 +1,4 @@ +$inherits: + from: 'circular_ref.yml' + variables: + woot: 'inherit' diff --git a/testing/taskcluster/tests/fixtures/circular_ref.yml b/testing/taskcluster/tests/fixtures/circular_ref.yml new file mode 100644 index 000000000000..28d78f3a1539 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/circular_ref.yml @@ -0,0 +1,2 @@ +$inherits: + from: 'circular.yml' diff --git a/testing/taskcluster/tests/fixtures/deep/1.yml b/testing/taskcluster/tests/fixtures/deep/1.yml new file mode 100644 index 000000000000..20cdac987875 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/deep/1.yml @@ -0,0 +1 @@ +variable: {{value}} diff --git a/testing/taskcluster/tests/fixtures/deep/2.yml b/testing/taskcluster/tests/fixtures/deep/2.yml new file mode 100644 index 000000000000..e405cd910c8c --- /dev/null +++ b/testing/taskcluster/tests/fixtures/deep/2.yml @@ -0,0 +1,3 @@ +$inherits: + from: deep/1.yml + diff --git a/testing/taskcluster/tests/fixtures/deep/3.yml b/testing/taskcluster/tests/fixtures/deep/3.yml new file mode 100644 index 000000000000..b4d0ffb74248 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/deep/3.yml @@ -0,0 +1,3 @@ +$inherits: + from: deep/2.yml + diff --git a/testing/taskcluster/tests/fixtures/deep/4.yml b/testing/taskcluster/tests/fixtures/deep/4.yml new file mode 100644 index 000000000000..0b7bceb4b53e --- /dev/null +++ b/testing/taskcluster/tests/fixtures/deep/4.yml @@ -0,0 +1,2 @@ +$inherits: + from: deep/3.yml diff --git a/testing/taskcluster/tests/fixtures/extend_child.yml b/testing/taskcluster/tests/fixtures/extend_child.yml new file mode 100644 index 000000000000..efc4a7a43ae0 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/extend_child.yml @@ -0,0 +1,7 @@ +list: ['1', '2', '3'] +was_list: ['1'] +obj: + level: 1 + deeper: + woot: 'bar' + list: ['baz'] diff --git a/testing/taskcluster/tests/fixtures/extend_parent.yml b/testing/taskcluster/tests/fixtures/extend_parent.yml new file mode 100644 index 000000000000..b9bb11c9d755 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/extend_parent.yml @@ -0,0 +1,11 @@ +$inherits: + from: 'extend_child.yml' + +list: ['4'] +was_list: + replaced: true +obj: + level: 2 + from_parent: true + deeper: + list: ['bar'] diff --git a/testing/taskcluster/tests/fixtures/inherit.yml b/testing/taskcluster/tests/fixtures/inherit.yml new file mode 100644 index 000000000000..400d107ec378 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/inherit.yml @@ -0,0 +1,4 @@ +$inherits: + from: 'templates.yml' + variables: + woot: 'inherit' diff --git a/testing/taskcluster/tests/fixtures/inherit_pass.yml b/testing/taskcluster/tests/fixtures/inherit_pass.yml new file mode 100644 index 000000000000..5a6ef9b60778 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/inherit_pass.yml @@ -0,0 +1,6 @@ +$inherits: + from: 'child_pass.yml' + variables: + a: 'a' + b: 'b' + c: 'c' diff --git a/testing/taskcluster/tests/fixtures/simple.yml b/testing/taskcluster/tests/fixtures/simple.yml new file mode 100644 index 000000000000..d74ec7511859 --- /dev/null +++ b/testing/taskcluster/tests/fixtures/simple.yml @@ -0,0 +1 @@ +is_simple: true diff --git a/testing/taskcluster/tests/fixtures/templates.yml b/testing/taskcluster/tests/fixtures/templates.yml new file mode 100644 index 000000000000..c211a9775a2a --- /dev/null +++ b/testing/taskcluster/tests/fixtures/templates.yml @@ -0,0 +1,2 @@ +content: 'content' +variable: '{{woot}}' diff --git a/testing/taskcluster/tests/test_build_task.py b/testing/taskcluster/tests/test_build_task.py new file mode 100755 index 000000000000..8949d1ce2e8a --- /dev/null +++ b/testing/taskcluster/tests/test_build_task.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +import unittest +import mozunit +import taskcluster_graph.build_task as build_task + +class TestBuildTask(unittest.TestCase): + + def test_validate_missing_extra(self): + with self.assertRaises(build_task.BuildTaskValidationException): + build_task.validate({}) + + def test_validate_valid(self): + with self.assertRaises(build_task.BuildTaskValidationException): + build_task.validate({ + 'extra': { + 'locations': { + 'build': '', + 'tests': '' + } + } + }) + +if __name__ == '__main__': + mozunit.main() + diff --git a/testing/taskcluster/tests/test_commit_parser.py b/testing/taskcluster/tests/test_commit_parser.py new file mode 100755 index 000000000000..7d614f7bc434 --- /dev/null +++ b/testing/taskcluster/tests/test_commit_parser.py @@ -0,0 +1,496 @@ +#!/usr/bin/env python + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +import unittest +import mozunit +from taskcluster_graph.commit_parser import ( + parse_commit, + normalize_test_list, + InvalidCommitException +) + +class TestCommitParser(unittest.TestCase): + + def test_normalize_test_list_none(self): + self.assertEqual( + normalize_test_list(['woot'], 'none'), [] + ) + + def test_normalize_test_list_all(self): + self.assertEqual( + normalize_test_list(['woot'], 'all'), + [{ 'test': 'woot' }] + ) + + def test_normalize_test_list_specific_tests(self): + self.assertEqual( + normalize_test_list(['woot'], 'a,b,c'), + [{ 'test': 'a' }, { 'test': 'b' }, { 'test': 'c' }] + ) + + def test_normalize_test_list_specific_tests_with_whitespace(self): + self.assertEqual( + normalize_test_list(['woot'], 'a, b, c'), + [{ 'test': 'a' }, { 'test': 'b' }, { 'test': 'c' }] + ) + + def test_invalid_commit(self): + ''' + Disallow invalid commit messages from being parsed... + ''' + with self.assertRaises(InvalidCommitException): + parse_commit("wootbarbaz", {}) + + def test_commit_no_tests(self): + ''' + This test covers the case of builds but no tests passed -u none + ''' + commit = 'try: -b o -p linux -u none -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'linux64'], + 'tests': ['web-platform-tests'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + }, + 'tests': {} + } + + expected = [ + { + 'task': 'task/linux', + 'dependents': [], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + def test_commit_all_builds_no_tests(self): + ''' + This test covers the case of all builds but no tests passed -u none + ''' + commit = 'try: -b o -p all -u none -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'linux64'], + 'tests': ['web-platform-tests'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + }, + 'tests': {} + } + + expected = [ + { + 'task': 'task/linux', + 'dependents': [], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + def test_some_test_tasks_restricted(self): + ''' + This test covers the case of all builds but no tests passed -u none + ''' + commit = 'try: -b do -p all -u all -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'linux64'], + 'tests': ['web-platform-tests'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + }, + 'tests': { + 'web-platform-tests': { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + } + } + } + } + } + + expected = [ + { + 'task': 'task/linux-debug', + 'dependents': [], + 'additional-parameters': {} + }, + { + 'task': 'task/linux', + 'dependents': [{ + 'allowed_build_tasks': { + 'task/linux': { + 'task':'task/web-platform-tests' + } + } + }], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + def test_specific_test_platforms(self): + ''' + This test cases covers the platform specific test exclusion options. + ''' + commit = 'try: -b od -p all -u all[windows,b2g] -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'win32'], + 'tests': ['web-platform-tests', 'mochitest'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + 'win32': { + 'platforms': ['windows'], + 'types': { + 'opt': { + 'task': 'task/win32', + } + } + }, + }, + 'tests': { + 'web-platform-tests': { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/win32': { + 'task': 'task/web-platform-tests', + } + } + }, + 'mochitest': { + 'allowed_build_tasks': { + 'task/linux-debug': { + 'task': 'task/mochitest', + }, + 'task/win32': { + 'task': 'task/mochitest', + } + } + } + } + } + + expected = [ + { + 'task': 'task/linux', + 'dependents': [], + 'additional-parameters': {} + }, + { + 'task': 'task/linux-debug', + 'dependents': [], + 'additional-parameters': {} + }, + { + 'task': 'task/win32', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/win32': { + 'task': 'task/web-platform-tests', + } + } + }, + { + 'allowed_build_tasks': { + 'task/linux-debug': { + 'task': 'task/mochitest', + }, + 'task/win32': { + 'task': 'task/mochitest', + } + } + } + ], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + def test_specific_test_platforms_with_specific_platform(self): + ''' + This test cases covers the platform specific test exclusion options. + ''' + commit = 'try: -b od -p win32 -u mochitest[windows] -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'win32'], + 'tests': ['web-platform-tests', 'mochitest'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux' + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + 'win32': { + 'platforms': ['windows'], + 'types': { + 'opt': { + 'task': 'task/win32' + } + } + }, + }, + 'tests': { + 'web-platform-tests': { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/win32': { + 'task': 'task/web-platform-tests', + } + } + }, + 'mochitest': { + 'allowed_build_tasks': { + 'task/linux-debug': { + 'task': 'task/mochitest', + }, + 'task/win32': { + 'task': 'task/mochitest', + } + } + } + } + } + + expected = [ + { + 'task': 'task/win32', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux-debug': { + 'task': 'task/mochitest', + }, + 'task/win32': { + 'task': 'task/mochitest', + } + } + } + ], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + def test_commit_with_builds_and_tests(self): + ''' + This test covers the broad case of a commit which has both builds and + tests without any exclusions or other fancy logic. + ''' + commit = 'try: -b od -p linux,linux64 -u web-platform-tests -t none' + jobs = { + 'flags': { + 'builds': ['linux', 'linux64'], + 'tests': ['web-platform-tests'], + }, + 'builds': { + 'linux': { + 'types': { + 'opt': { + 'task': 'task/linux', + }, + 'debug': { + 'task': 'task/linux-debug' + } + } + }, + 'linux64': { + 'types': { + 'opt': { + 'task': 'task/linux64', + }, + 'debug': { + 'task': 'task/linux64-debug' + } + } + } + }, + 'tests': { + 'web-platform-tests': { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/linux-debug': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64-debug': { + 'task': 'task/web-platform-tests', + } + } + } + } + } + + expected = [ + { + 'task': 'task/linux', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/linux-debug': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64-debug': { + 'task': 'task/web-platform-tests', + } + } + } + ], + 'additional-parameters': {} + }, + { + 'task': 'task/linux-debug', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/linux-debug': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64-debug': { + 'task': 'task/web-platform-tests', + } + } + } + ], + 'additional-parameters': {} + }, + { + 'task': 'task/linux64', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/linux-debug': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64-debug': { + 'task': 'task/web-platform-tests', + } + } + } + ], + 'additional-parameters': {} + }, + { + 'task': 'task/linux64-debug', + 'dependents': [ + { + 'allowed_build_tasks': { + 'task/linux': { + 'task': 'task/web-platform-tests', + }, + 'task/linux-debug': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64': { + 'task': 'task/web-platform-tests', + }, + 'task/linux64-debug': { + 'task': 'task/web-platform-tests', + } + } + } + ], + 'additional-parameters': {} + } + ] + + result = parse_commit(commit, jobs) + self.assertEqual(expected, result) + + +if __name__ == '__main__': + mozunit.main() + diff --git a/testing/taskcluster/tests/test_from_now.py b/testing/taskcluster/tests/test_from_now.py new file mode 100755 index 000000000000..b6ec41d6702d --- /dev/null +++ b/testing/taskcluster/tests/test_from_now.py @@ -0,0 +1,47 @@ +import unittest +import mozunit +from datetime import datetime +from taskcluster_graph.from_now import ( + InvalidString, + UnknownTimeMeasurement, + value_of, + json_time_from_now +) + +class FromNowTest(unittest.TestCase): + + def test_invalid_str(self): + with self.assertRaises(InvalidString): + value_of('wtfs') + + def test_missing_unit(self): + with self.assertRaises(InvalidString): + value_of('1') + + def test_missing_unknown_unit(self): + with self.assertRaises(UnknownTimeMeasurement): + value_of('1z') + + def test_value_of(self): + self.assertEqual(value_of('1s').total_seconds(), 1) + self.assertEqual(value_of('1 second').total_seconds(), 1) + self.assertEqual(value_of('1m').total_seconds(), 60) + self.assertEqual(value_of('1h').total_seconds(), 3600) + self.assertEqual(value_of('1d').total_seconds(), 86400) + self.assertEqual(value_of('1y').total_seconds(), 31536000) + + def test_json_from_now_utc_now(self): + # Just here to ensure we don't raise. + time = json_time_from_now('1 years') + + def test_json_from_now(self): + now = datetime(2014, 1, 1) + self.assertEqual(json_time_from_now('1 years', now), + '2015-01-01T00:00:00Z') + self.assertEqual(json_time_from_now('6 days', now), + '2014-01-07T00:00:00Z') + +if __name__ == '__main__': + mozunit.main() + + diff --git a/testing/taskcluster/tests/test_slugidjar.py b/testing/taskcluster/tests/test_slugidjar.py new file mode 100755 index 000000000000..d3baf87e0d13 --- /dev/null +++ b/testing/taskcluster/tests/test_slugidjar.py @@ -0,0 +1,19 @@ +import unittest +import mozunit +from datetime import datetime +from taskcluster_graph.slugidjar import SlugidJar + +class SlugidJarTest(unittest.TestCase): + + def test_slugidjar(self): + subject = Jar() + self.assertEqual(subject('woot'), subject('woot')) + self.assertTrue(type(subject('woot')) is str) + + other_jar = Jar() + self.assertNotEqual(subject('woot'), other_jar('woot')) + +if __name__ == '__main__': + mozunit.main() + + diff --git a/testing/taskcluster/tests/test_templates.py b/testing/taskcluster/tests/test_templates.py new file mode 100755 index 000000000000..24b95fd7caef --- /dev/null +++ b/testing/taskcluster/tests/test_templates.py @@ -0,0 +1,88 @@ +import os + +import unittest +import mozunit +from taskcluster_graph.templates import ( + Templates, + TemplatesException +) + +class TemplatesTest(unittest.TestCase): + + def setUp(self): + abs_path = os.path.abspath(os.path.dirname(__file__)) + self.subject = Templates(os.path.join(abs_path, 'fixtures')) + + + def test_invalid_path(self): + with self.assertRaisesRegexp(TemplatesException, 'must be a directory'): + Templates('/zomg/not/a/dir') + + def test_no_templates(self): + content = self.subject.load('simple.yml', {}) + self.assertEquals(content, { + 'is_simple': True + }) + + def test_with_templates(self): + content = self.subject.load('templates.yml', { + 'woot': 'bar' + }) + + self.assertEquals(content, { + 'content': 'content', + 'variable': 'bar' + }) + + def test_inheritance(self): + ''' + The simple single pass inheritance case. + ''' + content = self.subject.load('inherit.yml', {}) + self.assertEqual(content, { + 'content': 'content', + 'variable': 'inherit' + }) + + def test_inheritance_implicat_pass(self): + ''' + Implicitly pass parameters from the child to the ancestor. + ''' + content = self.subject.load('inherit_pass.yml', { + 'a': 'overriden' + }) + + self.assertEqual(content, { 'values': ['overriden', 'b', 'c'] }); + + + def test_inheritance_circular(self): + ''' + Circular reference handling. + ''' + with self.assertRaisesRegexp(TemplatesException, 'circular'): + self.subject.load('circular.yml', {}) + + def test_deep_inheritance(self): + content = self.subject.load('deep/4.yml', { + 'value': 'myvalue' + }) + self.assertEqual(content, { 'variable': 'myvalue' }) + + def test_inheritance_with_simple_extensions(self): + content = self.subject.load('extend_parent.yml', {}) + self.assertEquals(content, { + 'list': ['1', '2', '3', '4'], + 'obj': { + 'from_parent': True, + 'deeper': { + 'woot': 'bar', + 'list': ['baz', 'bar'] + }, + 'level': 2, + }, + 'was_list': { 'replaced': True } + }) + + +if __name__ == '__main__': + mozunit.main() diff --git a/testing/taskcluster/tests/test_try_test_parser.py b/testing/taskcluster/tests/test_try_test_parser.py new file mode 100755 index 000000000000..e59380286b3e --- /dev/null +++ b/testing/taskcluster/tests/test_try_test_parser.py @@ -0,0 +1,39 @@ +import unittest +import mozunit +from taskcluster_graph.try_test_parser import parse_test_opts + +class TryTestParserTest(unittest.TestCase): + + def test_parse_opts_valid(self): + self.assertEquals( + parse_test_opts('all[Amazing, Foobar woot,yeah]'), + [{ 'test': 'all', 'platforms': ['Amazing', 'Foobar woot', 'yeah'] }] + ) + + self.assertEquals( + parse_test_opts('a,b, c'), + [ + { 'test': 'a' }, + { 'test': 'b' }, + { 'test': 'c' }, + ] + ) + self.assertEquals( + parse_test_opts('woot, bar[b], baz, qux[ z ],a'), + [ + { 'test': 'woot' }, + { 'test': 'bar', 'platforms': ['b'] }, + { 'test': 'baz' }, + { 'test': 'qux', 'platforms': ['z'] }, + { 'test': 'a' } + ] + ) + + self.assertEquals( + parse_test_opts(''), + [] + ) + +if __name__ == '__main__': + mozunit.main() + diff --git a/testing/xpcshell/moz-spdy/moz-spdy.js b/testing/xpcshell/moz-spdy/moz-spdy.js index 13f3f8b16db3..6e4369284e96 100644 --- a/testing/xpcshell/moz-spdy/moz-spdy.js +++ b/testing/xpcshell/moz-spdy/moz-spdy.js @@ -90,17 +90,6 @@ function executeRunLater(arg) { } function handleRequest(req, res) { - try { - realHandleRequest(req, res); - } catch (e) { - console.log("spdy server suffered unhandled exception. will restart " + e); - var p = webServer.address().port; - webServer.close(); - webServer = spdy.createServer(options, handleRequest).listen(p, "0.0.0.0", 200, listenok); - } -} - -function realHandleRequest(req, res) { var u = url.parse(req.url); var content = getHttpContent(u.pathname); @@ -111,8 +100,6 @@ function realHandleRequest(req, res) { res.setHeader('X-Connection-Spdy', 'no'); } -console.log(u.pathname); - if (u.pathname === '/750ms') { var rl = new runlater(); rl.req = req; diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py index b4eb6be78180..b282620efd11 100755 --- a/testing/xpcshell/runxpcshelltests.py +++ b/testing/xpcshell/runxpcshelltests.py @@ -949,7 +949,7 @@ class XPCShellTests(object): # We pipe stdin to node because the spdy server will exit when its # stdin reaches EOF process = Popen([nodeBin, serverJs], stdin=PIPE, stdout=PIPE, - stderr=STDOUT, env=self.env, cwd=os.getcwd()) + stderr=PIPE, env=self.env, cwd=os.getcwd()) self.nodeProc[name] = process # Check to make sure the server starts properly by waiting for it to @@ -979,7 +979,19 @@ class XPCShellTests(object): """ for name, proc in self.nodeProc.iteritems(): self.log.info('Node %s server shutting down ...' % name) - proc.terminate() + if proc.poll() is not None: + self.log.info('Node server %s already dead %s' % (name, proc.poll())) + else: + proc.terminate() + def dumpOutput(fd, label): + firstTime = True + for msg in fd: + if firstTime: + firstTime = False; + self.log.info('Process %s' % label) + self.log.info(msg) + dumpOutput(proc.stdout, "stdout") + dumpOutput(proc.stderr, "stderr") def buildXpcsRunArgs(self): """ diff --git a/toolkit/content/tests/chrome/test_focus_anons.xul b/toolkit/content/tests/chrome/test_focus_anons.xul index 754b995edee0..848590887b03 100644 --- a/toolkit/content/tests/chrome/test_focus_anons.xul +++ b/toolkit/content/tests/chrome/test_focus_anons.xul @@ -3,7 +3,7 @@ diff --git a/toolkit/locales/l10n.mk b/toolkit/locales/l10n.mk index d7d6787ababc..822b1f462ef8 100644 --- a/toolkit/locales/l10n.mk +++ b/toolkit/locales/l10n.mk @@ -113,9 +113,11 @@ ifdef MOZ_STUB_INSTALLER endif $(PYTHON) $(MOZILLA_DIR)/toolkit/mozapps/installer/l10n-repack.py $(STAGEDIST) $(DIST)/xpi-stage/locale-$(AB_CD) \ $(if $(filter omni,$(MOZ_PACKAGER_FORMAT)),$(if $(NON_OMNIJAR_FILES),--non-resource $(NON_OMNIJAR_FILES))) -ifneq (en,$(AB)) + ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT)) +ifneq (en,$(AB)) mv $(STAGEDIST)/en.lproj $(STAGEDIST)/$(AB).lproj +endif ifdef MOZ_CRASHREPORTER # On Mac OS X, the crashreporter.ini file needs to be moved from under the # application bundle's Resources directory where all other l10n files are @@ -125,7 +127,7 @@ ifdef MOZ_CRASHREPORTER $(RM) -rf $(STAGEDIST)/crashreporter.app endif endif -endif + $(NSINSTALL) -D $(DIST)/l10n-stage/$(PKG_PATH) cd $(DIST)/l10n-stage; \ $(MAKE_PACKAGE) diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp index ea4cc0e2d35b..078bba2382b8 100644 --- a/widget/gtk/nsLookAndFeel.cpp +++ b/widget/gtk/nsLookAndFeel.cpp @@ -22,6 +22,9 @@ #include "gtkdrawing.h" #include "nsStyleConsts.h" #include "gfxFontConstants.h" + +#include + #include "mozilla/gfx/2D.h" using mozilla::LookAndFeel; @@ -733,6 +736,16 @@ GetSystemFontInfo(GtkWidget *aWidget, size *= float(gfxPlatformGtk::GetDPI()) / POINTS_PER_INCH_FLOAT; } + // Scale fonts up on HiDPI displays. + // This would be done automatically with cairo, but we manually manage + // the display scale for platform consistency. + static auto sGdkScreenGetMonitorScaleFactorPtr = (gint (*)(GdkScreen*,gint)) + dlsym(RTLD_DEFAULT, "gdk_screen_get_monitor_scale_factor"); + if (sGdkScreenGetMonitorScaleFactorPtr) { + GdkScreen *screen = gdk_screen_get_default(); + size *= (*sGdkScreenGetMonitorScaleFactorPtr)(screen, 0); + } + // |size| is now pixels aFontStyle->size = size; diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp index 6b752e74ab71..0766fc4e1c0b 100644 --- a/widget/gtk/nsWindow.cpp +++ b/widget/gtk/nsWindow.cpp @@ -123,6 +123,8 @@ extern "C" { #include "NativeKeyBindings.h" #include "nsWindow.h" +#include + #include "mozilla/layers/APZCTreeManager.h" using namespace mozilla; @@ -473,6 +475,9 @@ nsWindow::DispatchEvent(WidgetGUIEvent* aEvent, nsEventStatus& aStatus) debug_DumpEvent(stdout, aEvent->widget, aEvent, nsAutoCString("something"), 0); #endif + // Translate the mouse event into device pixels. + aEvent->refPoint.x = GdkCoordToDevicePixels(aEvent->refPoint.x); + aEvent->refPoint.y = GdkCoordToDevicePixels(aEvent->refPoint.y); aStatus = nsEventStatus_eIgnore; nsIWidgetListener* listener = @@ -731,6 +736,12 @@ nsWindow::GetDPI() return float(DisplayHeight(dpy, defaultScreen)/heightInches); } +double +nsWindow::GetDefaultScaleInternal() +{ + return GdkScaleFactor(); +} + NS_IMETHODIMP nsWindow::SetParent(nsIWidget *aNewParent) { @@ -829,8 +840,9 @@ nsWindow::ReparentNativeWidgetInternal(nsIWidget* aNewParent, } if (!mIsTopLevel) { - gdk_window_reparent(mGdkWindow, aNewParentWindow, mBounds.x, - mBounds.y); + gdk_window_reparent(mGdkWindow, aNewParentWindow, + DevicePixelsToGdkCoordRoundDown(mBounds.x), + DevicePixelsToGdkCoordRoundDown(mBounds.y)); } } @@ -865,26 +877,26 @@ NS_IMETHODIMP nsWindow::ConstrainPosition(bool aAllowSlop, int32_t *aX, int32_t *aY) { if (mIsTopLevel && mShell) { - int32_t screenWidth = gdk_screen_width(); - int32_t screenHeight = gdk_screen_height(); + int width = GdkCoordToDevicePixels(gdk_screen_width()); + int height = GdkCoordToDevicePixels(gdk_screen_height()); if (aAllowSlop) { if (*aX < (kWindowPositionSlop - mBounds.width)) *aX = kWindowPositionSlop - mBounds.width; - if (*aX > (screenWidth - kWindowPositionSlop)) - *aX = screenWidth - kWindowPositionSlop; + if (*aX > (width - kWindowPositionSlop)) + *aX = width - kWindowPositionSlop; if (*aY < (kWindowPositionSlop - mBounds.height)) *aY = kWindowPositionSlop - mBounds.height; - if (*aY > (screenHeight - kWindowPositionSlop)) - *aY = screenHeight - kWindowPositionSlop; + if (*aY > (height - kWindowPositionSlop)) + *aY = height - kWindowPositionSlop; } else { if (*aX < 0) *aX = 0; - if (*aX > (screenWidth - mBounds.width)) - *aX = screenWidth - mBounds.width; + if (*aX > (width - mBounds.width)) + *aX = width - mBounds.width; if (*aY < 0) *aY = 0; - if (*aY > (screenHeight - mBounds.height)) - *aY = screenHeight - mBounds.height; + if (*aY > (height - mBounds.height)) + *aY = height - mBounds.height; } } return NS_OK; @@ -897,10 +909,14 @@ void nsWindow::SetSizeConstraints(const SizeConstraints& aConstraints) if (mShell) { GdkGeometry geometry; - geometry.min_width = mSizeConstraints.mMinSize.width; - geometry.min_height = mSizeConstraints.mMinSize.height; - geometry.max_width = mSizeConstraints.mMaxSize.width; - geometry.max_height = mSizeConstraints.mMaxSize.height; + geometry.min_width = DevicePixelsToGdkCoordRoundUp( + mSizeConstraints.mMinSize.width); + geometry.min_height = DevicePixelsToGdkCoordRoundUp( + mSizeConstraints.mMinSize.height); + geometry.max_width = DevicePixelsToGdkCoordRoundDown( + mSizeConstraints.mMaxSize.width); + geometry.max_height = DevicePixelsToGdkCoordRoundDown( + mSizeConstraints.mMaxSize.height); uint32_t hints = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE; gtk_window_set_geometry_hints(GTK_WINDOW(mShell), nullptr, @@ -1163,11 +1179,13 @@ nsWindow::Move(double aX, double aY) mNeedsMove = false; + GdkPoint point = DevicePixelsToGdkPointRoundDown(nsIntPoint(x, y)); + if (mIsTopLevel) { - gtk_window_move(GTK_WINDOW(mShell), x, y); + gtk_window_move(GTK_WINDOW(mShell), point.x, point.y); } else if (mGdkWindow) { - gdk_window_move(mGdkWindow, x, y); + gdk_window_move(mGdkWindow, point.x, point.y); } NotifyRollupGeometryChange(); @@ -1434,7 +1452,7 @@ nsWindow::GetScreenBounds(nsIntRect &aRect) // use the point including window decorations gint x, y; gdk_window_get_root_origin(gtk_widget_get_window(GTK_WIDGET(mContainer)), &x, &y); - aRect.MoveTo(x, y); + aRect.MoveTo(GdkPointToDevicePixels({ x, y })); } else { aRect.MoveTo(WidgetToScreenOffset()); @@ -1604,17 +1622,12 @@ nsWindow::Invalidate(const nsIntRect &aRect) if (!mGdkWindow) return NS_OK; - GdkRectangle rect; - rect.x = aRect.x; - rect.y = aRect.y; - rect.width = aRect.width; - rect.height = aRect.height; + GdkRectangle rect = DevicePixelsToGdkRectRoundOut(aRect); + gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); LOGDRAW(("Invalidate (rect) [%p]: %d %d %d %d\n", (void *)this, rect.x, rect.y, rect.width, rect.height)); - gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); - return NS_OK; } @@ -1752,7 +1765,7 @@ nsWindow::WidgetToScreenOffset() gdk_window_get_origin(mGdkWindow, &x, &y); } - return nsIntPoint(x, y); + return GdkPointToDevicePixels({ x, y }); } NS_IMETHODIMP @@ -2044,7 +2057,9 @@ nsWindow::OnExposeEvent(cairo_t *cr) return FALSE; } - nsIntRegion ®ion = exposeRegion.mRegion; + gint scale = GdkScaleFactor(); + nsIntRegion& region = exposeRegion.mRegion; + region.ScaleRoundOut(scale, scale); ClientLayerManager *clientLayers = (GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT) @@ -2384,21 +2399,24 @@ nsWindow::OnSizeAllocate(GtkAllocation *aAllocation) (void *)this, aAllocation->x, aAllocation->y, aAllocation->width, aAllocation->height)); - nsIntSize size(aAllocation->width, aAllocation->height); + nsIntSize size = GdkRectToDevicePixels(*aAllocation).Size(); + if (mBounds.Size() == size) return; + nsIntRect rect; + // Invalidate the new part of the window now for the pending paint to // minimize background flashes (GDK does not do this for external resizes // of toplevels.) if (mBounds.width < size.width) { - GdkRectangle rect = - { mBounds.width, 0, size.width - mBounds.width, size.height }; + GdkRectangle rect = DevicePixelsToGdkRectRoundOut( + { mBounds.width, 0, size.width - mBounds.width, size.height }); gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); } if (mBounds.height < size.height) { - GdkRectangle rect = - { 0, mBounds.height, size.width, size.height - mBounds.height }; + GdkRectangle rect = DevicePixelsToGdkRectRoundOut( + { 0, mBounds.height, size.width, size.height - mBounds.height }); gdk_window_invalidate_rect(mGdkWindow, &rect, FALSE); } @@ -3861,14 +3879,17 @@ nsWindow::SetWindowClass(const nsAString &xulWinType) void nsWindow::NativeResize(int32_t aWidth, int32_t aHeight, bool aRepaint) { + gint width = DevicePixelsToGdkCoordRoundUp(aWidth); + gint height = DevicePixelsToGdkCoordRoundUp(aHeight); + LOG(("nsWindow::NativeResize [%p] %d %d\n", (void *)this, - aWidth, aHeight)); + width, height)); // clear our resize flag mNeedsResize = false; if (mIsTopLevel) { - gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + gtk_window_resize(GTK_WINDOW(mShell), width, height); } else if (mContainer) { GtkWidget *widget = GTK_WIDGET(mContainer); @@ -3876,12 +3897,12 @@ nsWindow::NativeResize(int32_t aWidth, int32_t aHeight, bool aRepaint) gtk_widget_get_allocation(widget, &prev_allocation); allocation.x = prev_allocation.x; allocation.y = prev_allocation.y; - allocation.width = aWidth; - allocation.height = aHeight; + allocation.width = width; + allocation.height = height; gtk_widget_size_allocate(widget, &allocation); } else if (mGdkWindow) { - gdk_window_resize(mGdkWindow, aWidth, aHeight); + gdk_window_resize(mGdkWindow, width, height); } } @@ -3890,28 +3911,33 @@ nsWindow::NativeResize(int32_t aX, int32_t aY, int32_t aWidth, int32_t aHeight, bool aRepaint) { + gint width = DevicePixelsToGdkCoordRoundUp(aWidth); + gint height = DevicePixelsToGdkCoordRoundUp(aHeight); + gint x = DevicePixelsToGdkCoordRoundDown(aX); + gint y = DevicePixelsToGdkCoordRoundDown(aY); + mNeedsResize = false; mNeedsMove = false; LOG(("nsWindow::NativeResize [%p] %d %d %d %d\n", (void *)this, - aX, aY, aWidth, aHeight)); + x, y, width, height)); if (mIsTopLevel) { - // aX and aY give the position of the window manager frame top-left. - gtk_window_move(GTK_WINDOW(mShell), aX, aY); + // x and y give the position of the window manager frame top-left. + gtk_window_move(GTK_WINDOW(mShell), x, y); // This sets the client window size. - gtk_window_resize(GTK_WINDOW(mShell), aWidth, aHeight); + gtk_window_resize(GTK_WINDOW(mShell), width, height); } else if (mContainer) { GtkAllocation allocation; - allocation.x = aX; - allocation.y = aY; - allocation.width = aWidth; - allocation.height = aHeight; + allocation.x = x; + allocation.y = y; + allocation.width = width; + allocation.height = height; gtk_widget_size_allocate(GTK_WIDGET(mContainer), &allocation); } else if (mGdkWindow) { - gdk_window_move_resize(mGdkWindow, aX, aY, aWidth, aHeight); + gdk_window_move_resize(mGdkWindow, x, y, width, height); } } @@ -6191,8 +6217,8 @@ nsWindow::GetThebesSurface(cairo_t *cr) #if (MOZ_WIDGET_GTK == 2) gdk_drawable_get_size(GDK_DRAWABLE(mGdkWindow), &width, &height); #else - width = gdk_window_get_width(mGdkWindow); - height = gdk_window_get_height(mGdkWindow); + width = GdkCoordToDevicePixels(gdk_window_get_width(mGdkWindow)); + height = GdkCoordToDevicePixels(gdk_window_get_height(mGdkWindow)); #endif // Owen Taylor says this is the right thing to do! @@ -6218,25 +6244,11 @@ nsWindow::GetThebesSurface(cairo_t *cr) if (!usingShm) # endif // MOZ_HAVE_SHMIMAGE { -#if (MOZ_WIDGET_GTK == 3) -#if MOZ_TREE_CAIRO -#error "cairo-gtk3 target must be built with --enable-system-cairo" -#else - if (cr) { - cairo_surface_t *surf = cairo_get_target(cr); - if (cairo_surface_status(surf) != CAIRO_STATUS_SUCCESS) { - NS_NOTREACHED("Missing cairo target?"); - return nullptr; - } - mThebesSurface = gfxASurface::Wrap(surf); - } else -#endif -#endif // (MOZ_WIDGET_GTK == 3) - mThebesSurface = new gfxXlibSurface - (GDK_WINDOW_XDISPLAY(mGdkWindow), - gdk_x11_window_get_xid(mGdkWindow), - visual, - size); + mThebesSurface = new gfxXlibSurface + (GDK_WINDOW_XDISPLAY(mGdkWindow), + gdk_x11_window_get_xid(mGdkWindow), + visual, + size); } #endif // MOZ_X11 @@ -6304,6 +6316,8 @@ nsWindow::BeginMoveDrag(WidgetMouseEvent* aEvent) } // tell the window manager to start the move + screenX = DevicePixelsToGdkCoordRoundDown(screenX); + screenY = DevicePixelsToGdkCoordRoundDown(screenY); gdk_window_begin_move_drag(gdk_window, button, screenX, screenY, aEvent->time); @@ -6395,6 +6409,69 @@ nsWindow::ClearCachedResources() } } +gint +nsWindow::GdkScaleFactor() +{ +#if (MOZ_WIDGET_GTK >= 3) + // Available as of GTK 3.10+ + static auto sGdkWindowGetScaleFactorPtr = (gint (*)(GdkWindow*)) + dlsym(RTLD_DEFAULT, "gdk_window_get_scale_factor"); + if (sGdkWindowGetScaleFactorPtr) + return (*sGdkWindowGetScaleFactorPtr)(mGdkWindow); +#endif + return 1; +} + + +gint +nsWindow::DevicePixelsToGdkCoordRoundUp(int pixels) { + gint scale = GdkScaleFactor(); + return (pixels + scale - 1) / scale; +} + +gint +nsWindow::DevicePixelsToGdkCoordRoundDown(int pixels) { + gint scale = GdkScaleFactor(); + return pixels / scale; +} + +GdkPoint +nsWindow::DevicePixelsToGdkPointRoundDown(nsIntPoint point) { + gint scale = GdkScaleFactor(); + return { point.x / scale, point.y / scale }; +} + +GdkRectangle +nsWindow::DevicePixelsToGdkRectRoundOut(nsIntRect rect) { + gint scale = GdkScaleFactor(); + int x = rect.x / scale; + int y = rect.y / scale; + int right = (rect.x + rect.width + scale - 1) / scale; + int bottom = (rect.y + rect.height + scale - 1) / scale; + return { x, y, right - x, bottom - y }; +} + +int +nsWindow::GdkCoordToDevicePixels(gint coord) { + return coord * GdkScaleFactor(); +} + +nsIntPoint +nsWindow::GdkPointToDevicePixels(GdkPoint point) { + gint scale = GdkScaleFactor(); + return nsIntPoint(point.x * scale, + point.y * scale); +} + +nsIntRect +nsWindow::GdkRectToDevicePixels(GdkRectangle rect) { + gint scale = GdkScaleFactor(); + return nsIntRect(rect.x * scale, + rect.y * scale, + rect.width * scale, + rect.height * scale); +} + nsresult nsWindow::SynthesizeNativeMouseEvent(nsIntPoint aPoint, uint32_t aNativeMessage, diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h index e3508f3438ac..eeee01b10f76 100644 --- a/widget/gtk/nsWindow.h +++ b/widget/gtk/nsWindow.h @@ -97,6 +97,7 @@ public: NS_IMETHOD Destroy(void) MOZ_OVERRIDE; virtual nsIWidget *GetParent() MOZ_OVERRIDE; virtual float GetDPI() MOZ_OVERRIDE; + virtual double GetDefaultScaleInternal() MOZ_OVERRIDE; virtual nsresult SetParent(nsIWidget* aNewParent) MOZ_OVERRIDE; NS_IMETHOD SetModal(bool aModal) MOZ_OVERRIDE; virtual bool IsVisible() const MOZ_OVERRIDE; @@ -475,6 +476,20 @@ private: * however, IME doesn't work at that time. */ nsRefPtr mIMModule; + + // HiDPI scale conversion + gint GdkScaleFactor(); + + // To GDK + gint DevicePixelsToGdkCoordRoundUp(int pixels); + gint DevicePixelsToGdkCoordRoundDown(int pixels); + GdkPoint DevicePixelsToGdkPointRoundDown(nsIntPoint point); + GdkRectangle DevicePixelsToGdkRectRoundOut(nsIntRect rect); + + // From GDK + int GdkCoordToDevicePixels(gint coord); + nsIntPoint GdkPointToDevicePixels(GdkPoint point); + nsIntRect GdkRectToDevicePixels(GdkRectangle rect); }; class nsChildWindow : public nsWindow {