www/src/py_builtin_functions.js
function $$eval(src, _globals, _locals){
    if(_globals === undefined){_globals = _b_.None}
    if(_locals === undefined){_locals = _b_.None}

    var current_frame = $B.frames_stack[$B.frames_stack.length - 1]

    if(current_frame !== undefined){
        var current_locals_id = current_frame[0].replace(/\./, '_'),
            current_globals_id = current_frame[2].replace(/\./, '_')
    }

    var stack_len = $B.frames_stack.length

    var is_exec = arguments[3] == 'exec'

    if(src.__class__ === code){
        is_exec = src.mode == "exec"
        src = src.source
    }else if(typeof src !== 'string'){
        throw _b_.TypeError.$factory("eval() arg 1 must be a string, bytes "+
            "or code object")
    }

    // code will be run in a specific block
    var globals_id = '$exec_' + $B.UUID(),
        locals_id = '$exec_' + $B.UUID(),
        parent_scope

    if(_globals === _b_.None){
        if(current_locals_id == current_globals_id){
            locals_id = globals_id
        }

        var local_scope = {
            module: locals_id,
            id: locals_id,
            binding: {},
            bindings: {}
        }
        for(var attr in current_frame[1]){
            local_scope.binding[attr] = true
            local_scope.bindings[attr] = true
        }
        var global_scope = {
            module: globals_id,
            id: globals_id,
            binding: {},
            bindings: {}
        }
        for(var attr in current_frame[3]){
            global_scope.binding[attr] = true
            global_scope.bindings[attr] = true
        }
        local_scope.parent_block = global_scope
        global_scope.parent_block = $B.builtins_scope

        parent_scope = local_scope

        // restore parent scope object
        eval("$locals_" + parent_scope.id + " = current_frame[1]")

    }else{
        // If a _globals dictionary is provided, set or reuse its attribute
        // globals_id
        if(_globals.__class__ != _b_.dict){
            throw _b_.TypeError.$factory("exec() globals must be a dict, not "+
                _globals.__class__.$infos.__name__)
        }
        _globals.globals_id = _globals.globals_id || globals_id
        globals_id = _globals.globals_id

        if(_locals === _globals || _locals === _b_.None){
            locals_id = globals_id
            parent_scope = $B.builtins_scope
        }else{
            // The parent block of locals must be set to globals
            var grandparent_scope = {
                id: globals_id,
                parent_block: $B.builtins_scope,
                binding: {}
            }
            parent_scope = {
                id: locals_id,
                parent_block: grandparent_scope,
                binding: {}
            }
            for(var attr in _globals.$string_dict){
                grandparent_scope.binding[attr] = true
            }
            for(var attr in _locals.$string_dict){
                parent_scope.binding[attr] = true
            }
        }
    }

    // set module path
    $B.$py_module_path[globals_id] = $B.$py_module_path[current_globals_id]
    // Initialise the object for block namespaces
    eval('var $locals_' + globals_id + ' = {}\nvar $locals_' +
        locals_id + ' = {}')

    // Initialise block globals
    if(_globals === _b_.None){
        var gobj = current_frame[3],
            ex = 'var $locals_' + globals_id + ' = gobj;'
        eval(ex) // needed for generators
        for(var attr in gobj){
            if((! attr.startsWith("$")) || attr.startsWith('$$')){
                eval("$locals_" + globals_id +"[attr] = gobj[attr]")
            }
        }
    }else{
        if(_globals.$jsobj){var items = _globals.$jsobj}
        else{var items = _globals.$string_dict}
        eval("$locals_" + globals_id + " = _globals.$string_dict")
        for(var item in items){
            var item1 = $B.to_alias(item)
            try{
                eval('$locals_' + globals_id + '["' + item1 +
                    '"] = items[item]')
            }catch(err){
                console.log(err)
                console.log('error setting', item)
                break
            }
        }
    }

    // Initialise block locals

    if(_locals === _b_.None){
        if(_globals !== _b_.None){
            eval('var $locals_' + locals_id + ' = $locals_' + globals_id)
        }else{
            var lobj = current_frame[1],
                ex = ''
            for(var attr in current_frame[1]){
                if(attr.startsWith("$") && !attr.startsWith("$$")){continue}
                ex += '$locals_' + locals_id + '["' + attr +
                    '"] = current_frame[1]["' + attr + '"];'
                eval(ex)
            }
        }
    }else{
        if(_locals.$jsobj){var items = _locals.$jsobj}
        else{var items = _locals.$string_dict}
        for(var item in items){
            var item1 = $B.to_alias(item)
            try{
                eval('$locals_' + locals_id + '["' + item + '"] = items.' + item)
            }catch(err){
                console.log(err)
                console.log('error setting', item)
                break
            }
        }
    }
    eval("$locals_" + locals_id + ".$src = src")

    var root = $B.py2js(src, globals_id, locals_id, parent_scope),
        js, gns, lns

    if(_globals !== _b_.None && _locals == _b_.None){
        for(var attr in _globals.$string_dict){
            root.binding[attr] = true
        }
    }

    try{
        // The result of py2js ends with
        // try{
        //     (block code)
        //     $B.leave_frame($local_name)
        // }catch(err){
        //     $B.leave_frame($local_name)
        //     throw err
        // }
        var try_node = root.children[root.children.length - 2],
            instr = try_node.children[try_node.children.length - 2]
        // type of the last instruction in (block code)
        var type = instr.context.tree[0].type

        // If the Python function is eval(), not exec(), check that the source
        // is an expression

        switch(type){

            case 'expr':
            case 'list_or_tuple':
            case 'op':
            case 'ternary':
                // If the source is an expression, what we must execute is the
                // block inside the "try" clause : if we run root, since it's
                // wrapped in try / finally, the value produced by
                // eval(root.to_js()) will be None
                var children = try_node.children
                root.children.splice(root.children.length - 2, 2)
                for(var i = 0; i < children.length - 1; i++){
                    root.add(children[i])
                }
                break
            default:
                if(!is_exec){
                    throw _b_.SyntaxError.$factory(
                        "eval() argument must be an expression",
                        '<string>', 1, 1, src)
                }
        }

        js = root.to_js()

        if(is_exec){
            var locals_obj = eval("$locals_" + locals_id),
                globals_obj = eval("$locals_" + globals_id)

            if(_globals === _b_.None){
                var res = new Function("$locals_" + globals_id,
                    "$locals_" + locals_id, js)(globals_obj, locals_obj)

            }else{
                current_globals_obj = current_frame[3]
                current_locals_obj = current_frame[1]

                var res = new Function("$locals_" + globals_id,
                    "$locals_" + locals_id,
                    "$locals_" + current_globals_id,
                    "$locals_" + current_locals_id,
                    js)(globals_obj, locals_obj,
                        current_globals_obj, current_locals_obj)
            }
        }else{
            var res = eval(js)
        }

        gns = eval("$locals_" + globals_id)
        if($B.frames_stack[$B.frames_stack.length - 1][2] == globals_id){
            gns = $B.frames_stack[$B.frames_stack.length - 1][3]
        }

        // Update _locals with the namespace after execution
        if(_locals !== _b_.None){
            lns = eval("$locals_" + locals_id)
            for(var attr in lns){
                var attr1 = $B.from_alias(attr)
                if(attr1.charAt(0) != '$'){
                    if(_locals.$jsobj){_locals.$jsobj[attr] = lns[attr]}
                    else{_locals.$string_dict[attr1] = lns[attr]}
                }
            }
        }else{
            for(var attr in lns){
                if(attr !== "$src"){
                    current_frame[1][attr] = lns[attr]
                }
            }
        }

        if(_globals !== _b_.None){
            // Update _globals with the namespace after execution
            for(var attr in gns){
                attr1 = $B.from_alias(attr)
                if(attr1.charAt(0) != '$'){
                    if(_globals.$jsobj){_globals.$jsobj[attr] = gns[attr]}
                    else{_globals.$string_dict[attr1] = gns[attr]}
                }
            }
        }else{
            for(var attr in gns){
                if(attr !== "$src"){
                    current_frame[3][attr] = gns[attr]
                }
            }
        }

        // fixme: some extra variables are bleeding into locals...
        /*  This also causes issues for unittests */
        if(res === undefined){return _b_.None}
        return res
    }catch(err){
        err.src = src
        err.module = globals_id
        if(err.$py_error === undefined){throw $B.exception(err)}
        throw err
    }finally{
        // "leave_frame" was removed so we must execute it here
        if($B.frames_stack.length == stack_len + 1){
            $B.frames_stack.pop()
        }

        root = null
        js = null
        gns = null
        lns = null

        $B.clear_ns(globals_id)
        $B.clear_ns(locals_id)
    }
}
function $$eval(src, _globals, _locals){
    if(_globals === undefined){_globals = _b_.None}
    if(_locals === undefined){_locals = _b_.None}

    var current_frame = $B.frames_stack[$B.frames_stack.length - 1]

    if(current_frame !== undefined){
        var current_locals_id = current_frame[0].replace(/\./, '_'),
            current_globals_id = current_frame[2].replace(/\./, '_')
    }

    var stack_len = $B.frames_stack.length

    var is_exec = arguments[3] == 'exec'

    if(src.__class__ === code){
        is_exec = src.mode == "exec"
        src = src.source
    }else if(typeof src !== 'string'){
        throw _b_.TypeError.$factory("eval() arg 1 must be a string, bytes "+
            "or code object")
    }

    // code will be run in a specific block
    var globals_id = '$exec_' + $B.UUID(),
        locals_id = '$exec_' + $B.UUID(),
        parent_scope

    if(_globals === _b_.None){
        if(current_locals_id == current_globals_id){
            locals_id = globals_id
        }

        var local_scope = {
            module: locals_id,
            id: locals_id,
            binding: {},
            bindings: {}
        }
        for(var attr in current_frame[1]){
            local_scope.binding[attr] = true
            local_scope.bindings[attr] = true
        }
        var global_scope = {
            module: globals_id,
            id: globals_id,
            binding: {},
            bindings: {}
        }
        for(var attr in current_frame[3]){
            global_scope.binding[attr] = true
            global_scope.bindings[attr] = true
        }
        local_scope.parent_block = global_scope
        global_scope.parent_block = $B.builtins_scope

        parent_scope = local_scope

        // restore parent scope object
        eval("$locals_" + parent_scope.id + " = current_frame[1]")

    }else{
        // If a _globals dictionary is provided, set or reuse its attribute
        // globals_id
        if(_globals.__class__ != _b_.dict){
            throw _b_.TypeError.$factory("exec() globals must be a dict, not "+
                _globals.__class__.$infos.__name__)
        }
        _globals.globals_id = _globals.globals_id || globals_id
        globals_id = _globals.globals_id

        if(_locals === _globals || _locals === _b_.None){
            locals_id = globals_id
            parent_scope = $B.builtins_scope
        }else{
            // The parent block of locals must be set to globals
            var grandparent_scope = {
                id: globals_id,
                parent_block: $B.builtins_scope,
                binding: {}
            }
            parent_scope = {
                id: locals_id,
                parent_block: grandparent_scope,
                binding: {}
            }
            for(var attr in _globals.$string_dict){
                grandparent_scope.binding[attr] = true
            }
            for(var attr in _locals.$string_dict){
                parent_scope.binding[attr] = true
            }
        }
    }

    // set module path
    $B.$py_module_path[globals_id] = $B.$py_module_path[current_globals_id]
    // Initialise the object for block namespaces
    eval('var $locals_' + globals_id + ' = {}\nvar $locals_' +
        locals_id + ' = {}')

    // Initialise block globals
    if(_globals === _b_.None){
        var gobj = current_frame[3],
            ex = 'var $locals_' + globals_id + ' = gobj;'
        eval(ex) // needed for generators
        for(var attr in gobj){
            if((! attr.startsWith("$")) || attr.startsWith('$$')){
                eval("$locals_" + globals_id +"[attr] = gobj[attr]")
            }
        }
    }else{
        if(_globals.$jsobj){var items = _globals.$jsobj}
        else{var items = _globals.$string_dict}
        eval("$locals_" + globals_id + " = _globals.$string_dict")
        for(var item in items){
            var item1 = $B.to_alias(item)
            try{
                eval('$locals_' + globals_id + '["' + item1 +
                    '"] = items[item]')
            }catch(err){
                console.log(err)
                console.log('error setting', item)
                break
            }
        }
    }

    // Initialise block locals

    if(_locals === _b_.None){
        if(_globals !== _b_.None){
            eval('var $locals_' + locals_id + ' = $locals_' + globals_id)
        }else{
            var lobj = current_frame[1],
                ex = ''
            for(var attr in current_frame[1]){
                if(attr.startsWith("$") && !attr.startsWith("$$")){continue}
                ex += '$locals_' + locals_id + '["' + attr +
                    '"] = current_frame[1]["' + attr + '"];'
                eval(ex)
            }
        }
    }else{
        if(_locals.$jsobj){var items = _locals.$jsobj}
        else{var items = _locals.$string_dict}
        for(var item in items){
            var item1 = $B.to_alias(item)
            try{
                eval('$locals_' + locals_id + '["' + item + '"] = items.' + item)
            }catch(err){
                console.log(err)
                console.log('error setting', item)
                break
            }
        }
    }
    eval("$locals_" + locals_id + ".$src = src")

    var root = $B.py2js(src, globals_id, locals_id, parent_scope),
        js, gns, lns

    if(_globals !== _b_.None && _locals == _b_.None){
        for(var attr in _globals.$string_dict){
            root.binding[attr] = true
        }
    }

    try{
        // The result of py2js ends with
        // try{
        //     (block code)
        //     $B.leave_frame($local_name)
        // }catch(err){
        //     $B.leave_frame($local_name)
        //     throw err
        // }
        var try_node = root.children[root.children.length - 2],
            instr = try_node.children[try_node.children.length - 2]
        // type of the last instruction in (block code)
        var type = instr.context.tree[0].type

        // If the Python function is eval(), not exec(), check that the source
        // is an expression

        switch(type){

            case 'expr':
            case 'list_or_tuple':
            case 'op':
            case 'ternary':
                // If the source is an expression, what we must execute is the
                // block inside the "try" clause : if we run root, since it's
                // wrapped in try / finally, the value produced by
                // eval(root.to_js()) will be None
                var children = try_node.children
                root.children.splice(root.children.length - 2, 2)
                for(var i = 0; i < children.length - 1; i++){
                    root.add(children[i])
                }
                break
            default:
                if(!is_exec){
                    throw _b_.SyntaxError.$factory(
                        "eval() argument must be an expression",
                        '<string>', 1, 1, src)
                }
        }

        js = root.to_js()

        if(is_exec){
            var locals_obj = eval("$locals_" + locals_id),
                globals_obj = eval("$locals_" + globals_id)

            if(_globals === _b_.None){
                var res = new Function("$locals_" + globals_id,
                    "$locals_" + locals_id, js)(globals_obj, locals_obj)

            }else{
                current_globals_obj = current_frame[3]
                current_locals_obj = current_frame[1]

                var res = new Function("$locals_" + globals_id,
                    "$locals_" + locals_id,
                    "$locals_" + current_globals_id,
                    "$locals_" + current_locals_id,
                    js)(globals_obj, locals_obj,
                        current_globals_obj, current_locals_obj)
            }
        }else{
            var res = eval(js)
        }

        gns = eval("$locals_" + globals_id)
        if($B.frames_stack[$B.frames_stack.length - 1][2] == globals_id){
            gns = $B.frames_stack[$B.frames_stack.length - 1][3]
        }

        // Update _locals with the namespace after execution
        if(_locals !== _b_.None){
            lns = eval("$locals_" + locals_id)
            for(var attr in lns){
                var attr1 = $B.from_alias(attr)
                if(attr1.charAt(0) != '$'){
                    if(_locals.$jsobj){_locals.$jsobj[attr] = lns[attr]}
                    else{_locals.$string_dict[attr1] = lns[attr]}
                }
            }
        }else{
            for(var attr in lns){
                if(attr !== "$src"){
                    current_frame[1][attr] = lns[attr]
                }
            }
        }

        if(_globals !== _b_.None){
            // Update _globals with the namespace after execution
            for(var attr in gns){
                attr1 = $B.from_alias(attr)
                if(attr1.charAt(0) != '$'){
                    if(_globals.$jsobj){_globals.$jsobj[attr] = gns[attr]}
                    else{_globals.$string_dict[attr1] = gns[attr]}
                }
            }
        }else{
            for(var attr in gns){
                if(attr !== "$src"){
                    current_frame[3][attr] = gns[attr]
                }
            }
        }

        // fixme: some extra variables are bleeding into locals...
        /*  This also causes issues for unittests */
        if(res === undefined){return _b_.None}
        return res
    }catch(err){
        err.src = src
        err.module = globals_id
        if(err.$py_error === undefined){throw $B.exception(err)}
        throw err
    }finally{
        // "leave_frame" was removed so we must execute it here
        if($B.frames_stack.length == stack_len + 1){
            $B.frames_stack.pop()
        }

        root = null
        js = null
        gns = null
        lns = null

        $B.clear_ns(globals_id)
        $B.clear_ns(locals_id)
    }
}
function $$eval ( src , _globals , _locals ) { if ( _globals === undefined ) { _globals = _b_ . None } if ( _locals === undefined ) { _locals = _b_ . None } var current_frame = $B . frames_stack [ $B . frames_stack . length - 1 ] if ( current_frame !== undefined ) { var current_locals_id = current_frame [ 0 ] . replace ( / \. / , '_' ) , current_globals_id = current_frame [ 2 ] . replace ( / \. / , '_' ) } var stack_len = $B . frames_stack . length var is_exec = arguments [ 3 ] == 'exec' if ( src . __class__ === code ) { is_exec = src . mode == "exec" src = src . source } else if ( typeof src !== 'string' ) { throw _b_ . TypeError . $factory ( "eval() arg 1 must be a string, bytes " + "or code object" ) } // code will be run in a specific block var globals_id = '$exec_' + $B . UUID ( ) , locals_id = '$exec_' + $B . UUID ( ) , parent_scope if ( _globals === _b_ . None ) { if ( current_locals_id == current_globals_id ) { locals_id = globals_id } var local_scope = { module : locals_id , id : locals_id , binding : { } , bindings : { } } for ( var attr in current_frame [ 1 ] ) { local_scope . binding [ attr ] = true local_scope . bindings [ attr ] = true } var global_scope = { module : globals_id , id : globals_id , binding : { } , bindings : { } } for ( var attr in current_frame [ 3 ] ) { global_scope . binding [ attr ] = true global_scope . bindings [ attr ] = true } local_scope . parent_block = global_scope global_scope . parent_block = $B . builtins_scope parent_scope = local_scope // restore parent scope object eval ( "$locals_" + parent_scope . id + " = current_frame[1]" ) } else { // If a _globals dictionary is provided, set or reuse its attribute // globals_id if ( _globals . __class__ != _b_ . dict ) { throw _b_ . TypeError . $factory ( "exec() globals must be a dict, not " + _globals . __class__ . $infos . __name__ ) } _globals . globals_id = _globals . globals_id || globals_id globals_id = _globals . globals_id if ( _locals === _globals || _locals === _b_ . None ) { locals_id = globals_id parent_scope = $B . builtins_scope } else { // The parent block of locals must be set to globals var grandparent_scope = { id : globals_id , parent_block : $B . builtins_scope , binding : { } } parent_scope = { id : locals_id , parent_block : grandparent_scope , binding : { } } for ( var attr in _globals . $string_dict ) { grandparent_scope . binding [ attr ] = true } for ( var attr in _locals . $string_dict ) { parent_scope . binding [ attr ] = true } } } // set module path $B . $py_module_path [ globals_id ] = $B . $py_module_path [ current_globals_id ] // Initialise the object for block namespaces eval ( 'var $locals_' + globals_id + ' = {}\nvar $locals_' + locals_id + ' = {}' ) // Initialise block globals if ( _globals === _b_ . None ) { var gobj = current_frame [ 3 ] , ex = 'var $locals_' + globals_id + ' = gobj;' eval ( ex ) // needed for generators for ( var attr in gobj ) { if ( ( ! attr . startsWith ( "$" ) ) || attr . startsWith ( '$$' ) ) { eval ( "$locals_" + globals_id + "[attr] = gobj[attr]" ) } } } else { if ( _globals . $jsobj ) { var items = _globals . $jsobj } else { var items = _globals . $string_dict } eval ( "$locals_" + globals_id + " = _globals.$string_dict" ) for ( var item in items ) { var item1 = $B . to_alias ( item ) try { eval ( '$locals_' + globals_id + '["' + item1 + '"] = items[item]' ) } catch ( err ) { console . log ( err ) console . log ( 'error setting' , item ) break } } } // Initialise block locals if ( _locals === _b_ . None ) { if ( _globals !== _b_ . None ) { eval ( 'var $locals_' + locals_id + ' = $locals_' + globals_id ) } else { var lobj = current_frame [ 1 ] , ex = '' for ( var attr in current_frame [ 1 ] ) { if ( attr . startsWith ( "$" ) && ! attr . startsWith ( "$$" ) ) { continue } ex += '$locals_' + locals_id + '["' + attr + '"] = current_frame[1]["' + attr + '"];' eval ( ex ) } } } else { if ( _locals . $jsobj ) { var items = _locals . $jsobj } else { var items = _locals . $string_dict } for ( var item in items ) { var item1 = $B . to_alias ( item ) try { eval ( '$locals_' + locals_id + '["' + item + '"] = items.' + item ) } catch ( err ) { console . log ( err ) console . log ( 'error setting' , item ) break } } } eval ( "$locals_" + locals_id + ".$src = src" ) var root = $B . py2js ( src , globals_id , locals_id , parent_scope ) , js , gns , lns if ( _globals !== _b_ . None && _locals == _b_ . None ) { for ( var attr in _globals . $string_dict ) { root . binding [ attr ] = true } } try { // The result of py2js ends with // try{ //     (block code) //     $B.leave_frame($local_name) // }catch(err){ //     $B.leave_frame($local_name) //     throw err // } var try_node = root . children [ root . children . length - 2 ] , instr = try_node . children [ try_node . children . length - 2 ] // type of the last instruction in (block code) var type = instr . context . tree [ 0 ] . type // If the Python function is eval(), not exec(), check that the source // is an expression switch ( type ) { case 'expr' : case 'list_or_tuple' : case 'op' : case 'ternary' : // If the source is an expression, what we must execute is the // block inside the "try" clause : if we run root, since it's // wrapped in try / finally, the value produced by // eval(root.to_js()) will be None var children = try_node . children root . children . splice ( root . children . length - 2 , 2 ) for ( var i = 0 ; i < children . length - 1 ; i ++ ) { root . add ( children [ i ] ) } break default : if ( ! is_exec ) { throw _b_ . SyntaxError . $factory ( "eval() argument must be an expression" , '<string>' , 1 , 1 , src ) } } js = root . to_js ( ) if ( is_exec ) { var locals_obj = eval ( "$locals_" + locals_id ) , globals_obj = eval ( "$locals_" + globals_id ) if ( _globals === _b_ . None ) { var res = new Function ( "$locals_" + globals_id , "$locals_" + locals_id , js ) ( globals_obj , locals_obj ) } else { current_globals_obj = current_frame [ 3 ] current_locals_obj = current_frame [ 1 ] var res = new Function ( "$locals_" + globals_id , "$locals_" + locals_id , "$locals_" + current_globals_id , "$locals_" + current_locals_id , js ) ( globals_obj , locals_obj , current_globals_obj , current_locals_obj ) } } else { var res = eval ( js ) } gns = eval ( "$locals_" + globals_id ) if ( $B . frames_stack [ $B . frames_stack . length - 1 ] [ 2 ] == globals_id ) { gns = $B . frames_stack [ $B . frames_stack . length - 1 ] [ 3 ] } // Update _locals with the namespace after execution if ( _locals !== _b_ . None ) { lns = eval ( "$locals_" + locals_id ) for ( var attr in lns ) { var attr1 = $B . from_alias ( attr ) if ( attr1 . charAt ( 0 ) != '$' ) { if ( _locals . $jsobj ) { _locals . $jsobj [ attr ] = lns [ attr ] } else { _locals . $string_dict [ attr1 ] = lns [ attr ] } } } } else { for ( var attr in lns ) { if ( attr !== "$src" ) { current_frame [ 1 ] [ attr ] = lns [ attr ] } } } if ( _globals !== _b_ . None ) { // Update _globals with the namespace after execution for ( var attr in gns ) { attr1 = $B . from_alias ( attr ) if ( attr1 . charAt ( 0 ) != '$' ) { if ( _globals . $jsobj ) { _globals . $jsobj [ attr ] = gns [ attr ] } else { _globals . $string_dict [ attr1 ] = gns [ attr ] } } } } else { for ( var attr in gns ) { if ( attr !== "$src" ) { current_frame [ 3 ] [ attr ] = gns [ attr ] } } } // fixme: some extra variables are bleeding into locals... /*  This also causes issues for unittests */ if ( res === undefined ) { return _b_ . None } return res } catch ( err ) { err . src = src err . module = globals_id if ( err . $py_error === undefined ) { throw $B . exception ( err ) } throw err } finally { // "leave_frame" was removed so we must execute it here if ( $B . frames_stack . length == stack_len + 1 ) { $B . frames_stack . pop ( ) } root = null js = null gns = null lns = null $B . clear_ns ( globals_id ) $B . clear_ns ( locals_id ) } }
eval() (built in function)
eval () ( built in function )