Set the prototype delegator.
authorRoberto Raggi <roberto.raggi@nokia.com>
Wed, 9 May 2012 13:06:30 +0000 (15:06 +0200)
committerRoberto Raggi <roberto.raggi@nokia.com>
Wed, 9 May 2012 13:07:03 +0000 (15:07 +0200)
qmljs_objects.cpp
qmljs_runtime.cpp
qmljs_runtime.h
tests/fun.2.js

index dfc84a8..ee6399a 100644 (file)
@@ -115,9 +115,12 @@ void FunctionObject::call(Context *ctx)
 void FunctionObject::construct(Context *ctx)
 {
     __qmljs_init_object(ctx, &ctx->thisObject, new Object());
-    // ### set the prototype
     call(ctx);
-    ctx->result = ctx->thisObject;
+    Value proto;
+    if (get(String::get(ctx, QLatin1String("prototype")), &proto)) { // ### `prototype' should be a unique symbol
+        if (proto.type == OBJECT_TYPE)
+            ctx->thisObject.objectValue->prototype = proto.objectValue;
+    }
 }
 
 ScriptFunction::ScriptFunction(IR::Function *function)
index b9811af..b9b1a00 100644 (file)
@@ -403,15 +403,26 @@ void __qmljs_call_property(Context *context, Value *result, Value *base, String
 
 void __qmljs_construct_activation_property(Context *context, Value *result, String *name)
 {
+    __qmljs_construct_property(context, result, &context->activation, name);
+}
+
+void __qmljs_construct_property(Context *context, Value *result, Value *base, String *name)
+{
     Value func;
-    context->parent->activation.objectValue->get(name, &func);
+    Value thisObject = *base;
+    if (thisObject.type != OBJECT_TYPE)
+        __qmljs_to_object(context, &thisObject, base);
+
+    assert(thisObject.type == OBJECT_TYPE);
+    thisObject.objectValue->get(name, &func);
     if (func.type == OBJECT_TYPE) {
         if (FunctionObject *f = func.objectValue->asFunctionObject()) {
+            context->thisObject = thisObject;
             context->formals = f->formalParameterList;
             context->formalCount = f->formalParameterCount;
             f->construct(context);
             if (result)
-                __qmljs_copy(result, &context->result);
+                __qmljs_copy(result, &context->thisObject);
         } else {
             assert(!"not a function");
         }
index 7e815a7..ab30c5c 100644 (file)
@@ -49,6 +49,7 @@ void __qmljs_dispose_context(Context *ctx);
 void __qmljs_call_activation_property(Context *, Value *result, String *name);
 void __qmljs_construct_activation_property(Context *, Value *result, String *name);
 void __qmljs_call_property(Context *context, Value *result, Value *base, String *name);
+void __qmljs_construct_property(Context *context, Value *result, Value *base, String *name);
 
 // constructors
 void __qmljs_init_undefined(Context *ctx, Value *result);
index 7eabdd0..c3fb613 100644 (file)
@@ -4,6 +4,11 @@ function Point(x,y) {
     this.y = 20
 }
 
+Point.prototype = {
+    print: function() { print(this.x, this.y) }
+}
+
 var pt = new Point(10, 20)
 print(pt.x, pt.y)
+pt.print()