summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-01-18 16:30:24 +0000
committerMartin Odersky <odersky@gmail.com>2011-01-18 16:30:24 +0000
commitfc68a188f2c61eecc7f1b7a1b5294d5ca2512208 (patch)
treef4c1f8b26c13671df8744d32fdc237589b15bd15 /src
parent60f1b4b1c46719093f73b394e8680e03edf7fd4b (diff)
downloadscala-fc68a188f2c61eecc7f1b7a1b5294d5ca2512208.tar.gz
scala-fc68a188f2c61eecc7f1b7a1b5294d5ca2512208.tar.bz2
scala-fc68a188f2c61eecc7f1b7a1b5294d5ca2512208.zip
Cleaned up Dynamic.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/StdNames.scala1
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala17
-rw-r--r--src/library/scala/Dynamic.scala26
4 files changed, 23 insertions, 22 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
index e38f626932..340ab09c81 100644
--- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
@@ -153,7 +153,6 @@ trait Definitions extends reflect.generic.StandardDefinitions {
lazy val ClassClass = getClass(sn.Class)
def Class_getMethod = getMember(ClassClass, nme.getMethod_)
lazy val DynamicClass = getClass("scala.Dynamic")
- val Dynamic_OptInvokeMaxArgCount = 7
// fundamental modules
lazy val PredefModule: Symbol = getModule("scala.Predef")
diff --git a/src/compiler/scala/tools/nsc/symtab/StdNames.scala b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
index 04f71470f8..202555f709 100644
--- a/src/compiler/scala/tools/nsc/symtab/StdNames.scala
+++ b/src/compiler/scala/tools/nsc/symtab/StdNames.scala
@@ -192,6 +192,7 @@ trait StdNames extends reflect.generic.StdNames with NameManglers {
val head: NameType = "head"
val identity: NameType = "identity"
val inlinedEquals: NameType = "inlinedEquals"
+ val invokeDynamic: NameType = "invokeDynamic"
val isArray: NameType = "isArray"
val isDefinedAt: NameType = "isDefinedAt"
val isEmpty: NameType = "isEmpty"
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 9085affd62..586740bce3 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3471,17 +3471,14 @@ trait Typers extends Modes {
// try to expand according to Dynamic rules.
if (qual.tpe.widen.typeSymbol isNonBottomSubClass DynamicClass) {
- val op = context.tree match {
- case Apply(tree1, args) if tree1 eq tree =>
- "_invoke_" +
- (if (args.length <= Dynamic_OptInvokeMaxArgCount) args.length.toString
- else "")
- case _ =>
- "_select_"
+ val otherArgs = context.tree match {
+ case Apply(tree1, args) if tree1 eq tree => args
+ case _ => List()
+ }
+ var dynSelect = atPos(tree.pos) {
+ Apply(Select(qual, nme.invokeDynamic), Literal(Constant(name.toString)) :: otherArgs)
}
- return typed1(
- util.trace("dynatype: ")(Apply(Select(qual, op), List(Literal(Constant(name.toString))))),
- mode, pt)
+ return typed1(util.trace("dynatype: ")(dynSelect), mode, pt)
}
if (settings.debug.value) {
diff --git a/src/library/scala/Dynamic.scala b/src/library/scala/Dynamic.scala
index 502084949a..2d8dbc9977 100644
--- a/src/library/scala/Dynamic.scala
+++ b/src/library/scala/Dynamic.scala
@@ -1,18 +1,22 @@
package scala
+/** A trait that supports dynamic invocations. Instances `x` of this trait
+ * allow calls `x.meth(args)` for arbitrary method names `meth` and argument lists
+ * `args`. If a call is not natively supported by `x`, it is rewritten to
+ * `x.invokeDynamic("meth", args)`.
+ */
trait Dynamic {
- def _select_ (name: String): Dynamic
- def _invoke_ (name: String)(args: Any*): Dynamic
- def _invoke_0(name: String)(): Dynamic = _invoke_ (name)()
- def _invoke_1(name: String)(arg1: Any): Dynamic = _invoke_ (name) (arg1)
- def _invoke_2(name: String)(arg1: Any, arg2: Any): Dynamic = _invoke_ (name)(arg1, arg2)
- def _invoke_3(name: String)(arg1: Any, arg2: Any, arg3: Any): Dynamic = _invoke_ (name)(arg1, arg2, arg3)
- def _invoke_4(name: String)(arg1: Any, arg2: Any, arg3: Any, arg4: Any): Dynamic = _invoke_ (name)(arg1, arg2, arg3, arg4)
- def _invoke_5(name: String)(arg1: Any, arg2: Any, arg3: Any, arg4: Any, arg5: Any): Dynamic = _invoke_ (name)(arg1, arg2, arg3, arg4, arg5)
- def _invoke_6(name: String)(arg1: Any, arg2: Any, arg3: Any, arg4: Any, arg5: Any, arg6: Any): Dynamic = _invoke_ (name)(arg1, arg2, arg3, arg4, arg5, arg6)
- def _invoke_7(name: String)(arg1: Any, arg2: Any, arg3: Any, arg4: Any, arg5: Any, arg6: Any, arg7: Any): Dynamic = _invoke_ (name)(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
+ /** The dynamic invocation operation
+ * @param name The name of the invoked method
+ * @param args The arguments to the method
+ */
+ def invokeDynamic(name: String, args: Any*): Any
- def typed[T]: T = asInstanceOf[T]
+ /** Returns the underlying value typed as an instance of type T
+ * @param T The target type
+ */
+ def typed[T]: T
}
+