~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to src/embind/embind.js

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-06-11 15:45:24 UTC
  • mfrom: (1.2.1) (2.1.1 experimental)
  • Revision ID: package-import@ubuntu.com-20130611154524-rppb3w6tixlegv4n
Tags: 1.4.7~20130611~a1eb425-1
* New snapshot release
* Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
131
131
 
132
132
// from https://github.com/imvu/imvujs/blob/master/src/function.js
133
133
function createNamedFunction(name, body) {
 
134
    name = makeLegalFunctionName(name);
134
135
    /*jshint evil:true*/
135
136
    return new Function(
136
137
        "body",
270
271
        'fromWireType': function() {
271
272
            return undefined;
272
273
        },
 
274
        'toWireType': function(destructors, o) {
 
275
            // TODO: assert if anything else is given?
 
276
            return undefined;
 
277
        },
273
278
    });
274
279
}
275
280
 
306
311
        'toWireType': function(destructors, value) {
307
312
            // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could
308
313
            // avoid the following two if()s and assume value is of proper type.
309
 
            if (typeof value !== "number") {
 
314
            if (typeof value !== "number" && typeof value !== "boolean") {
310
315
                throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
311
316
            }
312
317
            if (value < minRange || value > maxRange) {
328
333
        'toWireType': function(destructors, value) {
329
334
            // todo: Here we have an opportunity for -O3 level "unsafe" optimizations: we could
330
335
            // avoid the following if() and assume value is of proper type.
331
 
            if (typeof value !== "number") {
332
 
                throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' +this.name);
 
336
            if (typeof value !== "number" && typeof value !== "boolean") {
 
337
                throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
333
338
            }
334
339
            return value;
335
340
        },
449
454
    });
450
455
}
451
456
 
 
457
function __embind_register_memory_view(rawType, name) {
 
458
    var typeMapping = [
 
459
        Int8Array,
 
460
        Uint8Array,
 
461
        Int16Array,
 
462
        Uint16Array,
 
463
        Int32Array,
 
464
        Uint32Array,
 
465
        Float32Array,
 
466
        Float64Array,        
 
467
    ];
 
468
 
 
469
    name = readLatin1String(name);
 
470
    registerType(rawType, {
 
471
        name: name,
 
472
        'fromWireType': function(handle) {
 
473
            var type = HEAPU32[handle >> 2];
 
474
            var size = HEAPU32[(handle >> 2) + 1]; // in elements
 
475
            var data = HEAPU32[(handle >> 2) + 2]; // byte offset into emscripten heap
 
476
            var TA = typeMapping[type];
 
477
            return new TA(HEAP8.buffer, data, size);
 
478
        },
 
479
    });
 
480
}
 
481
 
452
482
function runDestructors(destructors) {
453
483
    while (destructors.length) {
454
484
        var ptr = destructors.pop();
677
707
            },
678
708
            'toWireType': function(destructors, o) {
679
709
                if (elementsLength !== o.length) {
680
 
                    throw new TypeError("Incorrect number of tuple elements");
 
710
                    throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length);
681
711
                }
682
712
                var ptr = rawConstructor();
683
713
                for (var i = 0; i < elementsLength; ++i) {
685
715
                }
686
716
                if (destructors !== null) {
687
717
                    destructors.push(rawDestructor, ptr);
688
 
                 }
 
718
                }
689
719
                return ptr;
690
720
            },
691
721
            destructorFunction: rawDestructor,
802
832
 
803
833
        if (this.isSmartPointer) {
804
834
            var ptr = this.rawConstructor();
805
 
            destructors.push(this.rawDestructor, ptr);
 
835
            if (destructors !== null) {
 
836
                destructors.push(this.rawDestructor, ptr);
 
837
            }
806
838
            return ptr;
807
839
        } else {
808
840
            return 0;
854
886
                            clonedHandle.delete();
855
887
                        })
856
888
                    );
857
 
                    destructors.push(this.rawDestructor, ptr);
 
889
                    if (destructors !== null) {
 
890
                        destructors.push(this.rawDestructor, ptr);
 
891
                    }
858
892
                }
859
893
                break;
860
894
            
1054
1088
    return handle.$$.ptrType.registeredClass.name;
1055
1089
}
1056
1090
 
 
1091
ClassHandle.prototype.isAliasOf = function(other) {
 
1092
    if (!(this instanceof ClassHandle)) {
 
1093
        return false;
 
1094
    }
 
1095
    if (!(other instanceof ClassHandle)) {
 
1096
        return false;
 
1097
    }
 
1098
 
 
1099
    var leftClass = this.$$.ptrType.registeredClass;
 
1100
    var left = this.$$.ptr;
 
1101
    var rightClass = other.$$.ptrType.registeredClass;
 
1102
    var right = other.$$.ptr;
 
1103
 
 
1104
    while (leftClass.baseClass) {
 
1105
        left = leftClass.upcast(left);
 
1106
        leftClass = leftClass.baseClass;
 
1107
    }
 
1108
 
 
1109
    while (rightClass.baseClass) {
 
1110
        right = rightClass.upcast(right);
 
1111
        rightClass = rightClass.baseClass;
 
1112
    }
 
1113
    
 
1114
    return leftClass === rightClass && left === right;
 
1115
};
 
1116
 
 
1117
function throwInstanceAlreadyDeleted(obj) {
 
1118
    throwBindingError(getInstanceTypeName(obj) + ' instance already deleted');
 
1119
}
 
1120
 
1057
1121
ClassHandle.prototype.clone = function() {
1058
1122
    if (!this.$$.ptr) {
1059
 
        throwBindingError(getInstanceTypeName(this) + ' instance already deleted');
 
1123
        throwInstanceAlreadyDeleted(this);
1060
1124
    }
1061
1125
 
1062
1126
    var clone = Object.create(Object.getPrototypeOf(this), {
1078
1142
    }
1079
1143
}
1080
1144
 
1081
 
ClassHandle.prototype['delete'] = function() {
 
1145
ClassHandle.prototype['delete'] = function ClassHandle_delete() {
1082
1146
    if (!this.$$.ptr) {
1083
 
        throwBindingError(getInstanceTypeName(this) + ' instance already deleted');
 
1147
        throwInstanceAlreadyDeleted(this);
 
1148
    }
 
1149
    if (this.$$.deleteScheduled) {
 
1150
        throwBindingError('Object already scheduled for deletion');
1084
1151
    }
1085
1152
 
1086
1153
    this.$$.count.value -= 1;
1090
1157
    this.$$.smartPtr = undefined;
1091
1158
    this.$$.ptr = undefined;
1092
1159
};
 
1160
 
 
1161
var deletionQueue = [];
 
1162
 
 
1163
ClassHandle.prototype['isDeleted'] = function isDeleted() {
 
1164
    return !this.$$.ptr;
 
1165
};
 
1166
 
 
1167
ClassHandle.prototype['deleteLater'] = function deleteLater() {
 
1168
    if (!this.$$.ptr) {
 
1169
        throwInstanceAlreadyDeleted(this);
 
1170
    }
 
1171
    if (this.$$.deleteScheduled) {
 
1172
        throwBindingError('Object already scheduled for deletion');
 
1173
    }
 
1174
    deletionQueue.push(this);
 
1175
    if (deletionQueue.length === 1 && delayFunction) {
 
1176
        delayFunction(flushPendingDeletes);
 
1177
    }
 
1178
    this.$$.deleteScheduled = true;
 
1179
    return this;
 
1180
};
 
1181
 
 
1182
function flushPendingDeletes() {
 
1183
    while (deletionQueue.length) {
 
1184
        var obj = deletionQueue.pop();
 
1185
        obj.$$.deleteScheduled = false;
 
1186
        obj['delete']();
 
1187
    }
 
1188
}
 
1189
Module['flushPendingDeletes'] = flushPendingDeletes;
 
1190
 
 
1191
var delayFunction;
 
1192
Module['setDelayFunction'] = function setDelayFunction(fn) {
 
1193
    delayFunction = fn;
 
1194
    if (deletionQueue.length && delayFunction) {
 
1195
        delayFunction(flushPendingDeletes);
 
1196
    }
 
1197
};
1093
1198
        
1094
1199
function RegisteredClass(
1095
1200
    name,