[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gnash-commit
Subject:    [Gnash-commit] /srv/bzr/gnash/trunk r11182: Stop faking classes so
From:       Benjamin Wolsey <bwy () benjaminwolsey ! de>
Date:       2009-06-29 14:02:14
Message-ID: E1MLJHk-0001qD-V6 () sv ! gnu ! org
[Download RAW message or body]

------------------------------------------------------------
revno: 11182
committer: Benjamin Wolsey <bwy@benjaminwolsey.de>
branch nick: trunk
timestamp: Mon 2009-06-29 16:02:14 +0200
message:
  Stop faking classes so that error reporting is more accurate; it's not
  necessary for passing current testcases any more.
modified:
  libcore/asMethod.h
  libcore/parser/abc_block.cpp
    ------------------------------------------------------------
    revno: 11179.1.4
    committer: Benjamin Wolsey <bwy@benjaminwolsey.de>
    branch nick: work
    timestamp: Mon 2009-06-29 15:20:06 +0200
    message:
      Add note about method return type. Don't fail on unknown return type, as
      Gnash is doing this wrong. Don't fail on unknown parameter type; Gnash may
      not be doing this wrong, but it is unhelpful. Log and continue.
    modified:
      libcore/asMethod.h
      libcore/parser/abc_block.cpp
    ------------------------------------------------------------
    revno: 11179.1.5
    committer: Benjamin Wolsey <bwy@benjaminwolsey.de>
    branch nick: work
    timestamp: Mon 2009-06-29 15:41:27 +0200
    message:
      Document semantic of passing 0 to pushArgument.
    modified:
      libcore/asMethod.h
    ------------------------------------------------------------
    revno: 11179.1.6
    committer: Benjamin Wolsey <bwy@benjaminwolsey.de>
    branch nick: work
    timestamp: Mon 2009-06-29 15:42:31 +0200
    message:
      Comment on return type.
    modified:
      libcore/asMethod.h
    ------------------------------------------------------------
    revno: 11179.1.7
    committer: Benjamin Wolsey <bwy@benjaminwolsey.de>
    branch nick: work
    timestamp: Mon 2009-06-29 15:43:36 +0200
    message:
      Improve parsing algorithm slightly. Minor cleanups and improved logging.
    modified:
      libcore/parser/abc_block.cpp

["r11182.diff" (r11182.diff)]

=== modified file 'libcore/asMethod.h'
--- a/libcore/asMethod.h	2009-06-23 07:15:40 +0000
+++ b/libcore/asMethod.h	2009-06-29 13:42:31 +0000
@@ -143,6 +143,12 @@
 	asClass* getReturnType() const;
 
 	/// Set the return type
+    //
+    /// TODO: This is currently a no-op, so find out what it's for and
+    /// implement it.
+    /// NB: the return type of a method can be * (any) or void, neither of
+    /// which are asClasses, so this may not be an appropriate way to
+    /// handle return type.
 	void setReturnType(asClass* t);
 
 	asMethod *getSuper();
@@ -182,48 +188,43 @@
 	void setProtected() {
         _flags = (_flags & ~(FLAGS_PUBLIC | FLAGS_PRIVATE)) | FLAGS_PROTECTED; }
 
-	/// \brief
 	/// Is the method public?
 	bool isPublic() const { return _flags & FLAGS_PUBLIC; }
 
-	/// \brief
 	/// Make the method public.
 	void setPublic() {
         _flags = (_flags & ~(FLAGS_PRIVATE | FLAGS_PROTECTED)) | FLAGS_PUBLIC;
     }
 
-	/// \brief
 	/// How many arguments are required? -1 means unknown.
 	int minArgumentCount() const { return _minArguments; }
 
-	/// \brief
 	/// Set the required minimum arguments.
 	void setMinArgumentCount(int i) { _minArguments = i; }
 
-	/// \brief
 	/// How many arguments are allowed? -1 means unknown.
 	int maxArgumentCount() const { return _maxArguments; }
 
 	/// Set the required maximum arguments.
 	void setMaxArgumentCount(int i) { _maxArguments = i; }
 
-	/// \brief
 	/// Push an argument of type t into the method definition
-	void pushArgument(asClass *t) { _arguments.push_back(t); }
+    //
+    /// A value of 0 stands for 'any'.
+	void pushArgument(asClass* t) { _arguments.push_back(t); }
 
-	/// \brief
 	/// Push an optional argument's default value.
 	void pushOptional(const as_value& v) { _optionalArguments.push_back(v); }
 
-	/// \brief
 	/// Are any of the arguments optional?
 	bool optionalArguments() const {
         return minArgumentCount() != maxArgumentCount();
     }
 
-	/// \brief
 	/// Get a reference to a list of argument types.
-	ArgumentList& getArgumentList() { return _arguments; }
+    //
+    /// NB: Some values may be 0, meaning "any".
+	const ArgumentList& getArgumentList() const { return _arguments; }
 
 	/// \brief
 	/// Get an object capable of executing this function.

=== modified file 'libcore/parser/abc_block.cpp'
--- a/libcore/parser/abc_block.cpp	2009-06-29 12:27:22 +0000
+++ b/libcore/parser/abc_block.cpp	2009-06-29 13:43:36 +0000
@@ -241,8 +241,7 @@
 
 		boost::uint32_t offset = in->read_V32();
 		log_abc("Method index=%u", offset);
-		if (offset >= pBlock->_methods.size())
-		{
+		if (offset >= pBlock->_methods.size()) {
 			log_error(_("Bad method id in trait."));
 			return false;
 		}
@@ -268,8 +267,7 @@
 	{
 		_slotID = in->read_V32();
 		boost::uint32_t offset = in->read_V32();
-		if (offset >= pBlock->_methods.size())
-		{
+		if (offset >= pBlock->_methods.size()) {
 			log_error(_("Bad method id in trait."));
 			return false;
 		}
@@ -437,24 +435,8 @@
 	}
 	// One last chance: Look globally.
 	found = mCH->getGlobalNs()->getClass(m.getABCName());
-	if (found)
-		return found;
+    return found;
 
-	// Fake it here for a while.
-	if (m.getNamespace())
-	{
-		m.getNamespace()->stubPrototype(m.getABCName());
-		found = m.getNamespace()->getClass(m.getABCName());
-		return found;
-	}
-	else
-	{
-		// Fake in global.
-		mCH->getGlobalNs()->stubPrototype(m.getABCName());
-		found = mCH->getGlobalNs()->getClass(m.getABCName());
-		return found;
-	}
-	return NULL;
 }
 
 /// Read the ActionBlock version number.
@@ -561,9 +543,8 @@
 		log_abc("Namespace %u: kind %s, index %u, name %s", i,
                 static_cast<int>(kind), nameIndex, _stringPool[nameIndex]);
 
-		if (nameIndex >= _stringPool.size())
-		{
-			log_error(_("ABC: Out of bounds string given for namespace."));
+		if (nameIndex >= _stringPool.size()) {
+			log_error(_("ABC: Bad string given for namespace."));
 			return false;
 		}
 		
@@ -604,7 +585,7 @@
 			boost::uint32_t selection = _stream->read_V32();
 			if (!selection || selection >= _namespacePool.size())
 			{
-				log_error(_("ABC: Out of bounds namespace for namespace set."));
+				log_error(_("ABC: Bad namespace for namespace set."));
 				return false;
 			}
 			_namespaceSetPool[i][j] = _namespacePool[selection];
@@ -796,54 +777,68 @@
 		boost::uint32_t param_count = _stream->read_V32();
 		boost::uint32_t return_type = _stream->read_V32();
 
-		log_abc("  Param count: %u return type(index): %s(%u)", param_count, 
-                _stringPool[_multinamePool[return_type].getABCName()],
-                return_type);
+        const std::string& rt = return_type ? 
+            _stringPool[_multinamePool[return_type].getABCName()] :
+            "*";
+
+		log_abc("  Param count: %u, return type: %s", param_count, 
+                rt, return_type);
 
 		pMethod->setMinArgumentCount(param_count);
 		pMethod->setMaxArgumentCount(param_count);
 
-		if (return_type >= _multinamePool.size())
-		{
-			log_error(_("ABC: Out of bounds return type for method info."));
-			return false;
-		}
-		asClass *rtClass = locateClass(_multinamePool[return_type]);
-		if (!rtClass)
-		{
-			log_error(_("ABC: Unknown return type."));
-			return false;
-		}
-
-		pMethod->setReturnType(rtClass);
-
-		for (unsigned int j = 0; j < param_count; ++j)
-		{
+		if (return_type >= _multinamePool.size()) {
+			log_error(_("ABC: Bad return type for method info."));
+			return false;
+		}
+
+        if (!return_type) {
+            pMethod->setReturnType(0);
+        }
+        else {
+            // TODO: this can be 'void', which clearly isn't a class, so this
+            // seems bogus. As setReturnType is a no-op, we should log it
+            // and ignore it.
+            asClass* rtClass = locateClass(_multinamePool[return_type]);
+            if (!rtClass) {
+                log_abc(_("ABC: Unknown return type."));
+            }
+
+            pMethod->setReturnType(rtClass);
+        }
+		for (size_t j = 0; j < param_count; ++j) {
 			log_abc("  Reading parameter %u", j);
 			// The parameter type.
 			boost::uint32_t ptype = _stream->read_V32();
-			log_abc("   Parameter type(index): %s(%u)", 
-                    _stringPool[_multinamePool[ptype].getABCName()], ptype);
-
-			if (ptype >= _multinamePool.size())
-			{
-				log_error(_("ABC: Out of bounds parameter type in method."));
-				return false;
-			}
-			asClass *param_type = locateClass(_multinamePool[ptype]);
-//			log_abc("Done creating asClass object.");
-			if (!param_type)
-			{
-				log_error((_("ABC: Unknown parameter type.")));
-				return false;
-			}
-//			log_abc("Trying to add argument to method.");
-			pMethod->pushArgument(param_type);
-//			log_abc("Done adding argument to method object.");
+            
+            const std::string& pt = return_type ? 
+                _stringPool[_multinamePool[ptype].getABCName()] :
+                "*";
+			
+            log_abc("   Parameter type(index): %s(%u)", pt, ptype);
+
+			if (ptype >= _multinamePool.size()) {
+				log_error(_("ABC: Bad parameter type in method."));
+				return false;
+			}
+			
+            // A value of 0 is legitimate, meaning 'any (*)'. 
+            if (ptype) {
+                asClass* param_type = locateClass(_multinamePool[ptype]);
+
+                if (!param_type) {
+                    log_abc((_("ABC: Unknown parameter type.")));
+                }
+                
+                // This currently also pushes 0, meaning 'any'; perhaps it
+                // should throw a VerifyError if the class is not known.
+                pMethod->pushArgument(param_type);
+            }
+            else {
+                pMethod->pushArgument(0);
+            }
 		}
-//		log_abc("End loop j.");
-		// A skippable name index.
-//		_stream->skip_V32();
+
 		boost::uint32_t method_name = _stream->read_V32();
 		log_abc(  "Method name=%s %d", _stringPool[method_name], method_name);
 		boost::uint8_t flags = _stream->read_u8();
@@ -946,7 +941,7 @@
 		boost::uint32_t super_index = _stream->read_V32();;
 		if (super_index && super_index >= _multinamePool.size())
 		{
-			log_error(_("ABC: Out of bounds super type."));
+			log_error(_("ABC: Bad super type."));
 			return false;
 		}
 		if (!super_index)
@@ -1005,7 +1000,7 @@
 		if (flags & INSTANCE_PROTECTED_NS) {
 			boost::uint32_t ns_index = _stream->read_V32();
 			if (ns_index >= _namespacePool.size()) {
-				log_error(_("ABC: Out of bounds namespace for protected."));
+				log_error(_("ABC: Bad namespace for protected."));
 				return false;
 			}
 			// Set the protected namespace's parent, if it exists.
@@ -1024,7 +1019,7 @@
 			log_abc("Interface %u has multiname index=%u", i, i_index);
 			// 0 is allowed as an interface, typically for the last one.
 			if (i_index >= _multinamePool.size()) {
-				log_error(_("ABC: Out of bounds name for interface."));
+				log_error(_("ABC: Bad name for interface."));
 				return false;
 			}
 			asClass *pInterface = locateClass(_multinamePool[i_index]);



_______________________________________________
Gnash-commit mailing list
Gnash-commit@gnu.org
http://lists.gnu.org/mailman/listinfo/gnash-commit


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic